From 14f9ef9b717b3ce12f387e431853487a20ac3a9b Mon Sep 17 00:00:00 2001 From: shylinux Date: Wed, 8 Jul 2020 19:45:07 +0800 Subject: [PATCH] opt inner.js --- pane/Search.css | 2 +- pane/Search.js | 29 ++++++++- plugin/local/code/inner.css | 18 +++++- plugin/local/code/inner.js | 119 +++++++++++++++++++++++++++++++++--- plugin/local/wiki/word.js | 2 +- 5 files changed, 158 insertions(+), 12 deletions(-) diff --git a/pane/Search.css b/pane/Search.css index 5c7072c1..107a881e 100644 --- a/pane/Search.css +++ b/pane/Search.css @@ -1,6 +1,6 @@ fieldset.Search { display:none; - position:absolute; + position:fixed; left:120px; top:40px; background:black; diff --git a/pane/Search.js b/pane/Search.js index 51585fcd..511dbd63 100644 --- a/pane/Search.js +++ b/pane/Search.js @@ -27,6 +27,33 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, }) }, + active: function(can, msg, cmd, cb) { can._output.innerHTML = "" + function search(word) { cmd[1] = word + var ev = {}; var res = can.request(ev); res.Copy(msg) + can.run(ev, cmd, function(res) { can.ui.content.innerHTML = "" + can.onappend.table(can, can.ui.content, "table", res, function(value, key, index, line) { + can.Status("count", index+1) + return {text: [value, "td"], onclick: function(event) { + typeof cb == "function" && cb(line) + can.Status("index", index) + can.Status("value", value) + }} + }) + }) + } + + can.ui = can.page.Append(can, can._output, [ + {input: ["word", function(event) { + if (event.key == "Enter") { + search(event.target.value) + } + }], value: cmd[1]}, + {view: "content"}, + ]) + can.page.Modify(can, can._target, {style: {display: "block"}}) + can.ui.input.focus() + search(cmd[1]) + }, select: function(can, msg, cmd, cb) { can._output.innerHTML = "" function search(word) { cmd[1] = word can.run({}, cmd, function(msg) { can.ui.content.innerHTML = "" @@ -79,7 +106,7 @@ Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "完成"] "清空": function(event, can, key) { can._output.innerHTML = "" }, - "完成": function(event, can, key) { can.cb() }, + "完成": function(event, can, key) { can.cb && can.cb() }, }) Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"], "共享": function(event, can, value, sub) { var msg = sub.request(event) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 32c8cc78..f179a267 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -14,7 +14,8 @@ fieldset.editor>div.action>div.file.select { } fieldset.editor>div.output>div.project { - max-width:120px; overflow:auto; + max-height:400px; overflow:auto; + max-width:120px; } fieldset.editor>div.output>div.project div.item { cursor:pointer; @@ -46,6 +47,7 @@ fieldset.editor>div.output div.content { font-size:16px; font-family:monospace; border-left:solid 2px red; min-height:200px; + max-width:200px; float:left; } fieldset.editor>div.output div.content>pre.item { @@ -82,6 +84,20 @@ fieldset.editor>div.output pre.display:hover { max-height:640px; z-index:10; } +fieldset.editor>div.output div.search { + padding:6px; border:solid 1px red; + max-height:120px; overflow:auto; + position:sticky; bottom:0; + clear:both; + margin:0; +} +fieldset.editor>div.output div.search:hover { + background-color:black; + z-index:10; +} +fieldset.editor>div.output div.holdon { + max-height:400px; overflow:auto; +} fieldset.editor>div.output textarea.editor { position:absolute; padding:0; margin:0; diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 3d1f64ed..383cc8f1 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,11 +1,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) { target.innerHTML = "" if (can.Conf("height") < 600) { can.Conf("height", 600) } can.onimport._share(can); var width = can.Conf("width"), height = can.Conf("height") - can.page.Modify(can, target, {style: {"max-height": height-160+"px"}}) + // can.page.Modify(can, target, {style: {"max-height": height-160+"px"}}) can.onappend.table(can, target, "table", msg), can.ui = can.page.Append(can, target, [ {view: "project"}, {view: "profile"}, - {view: "preview"}, {view: "content", style: {"max-width": can.Conf("width")-240+"px"}}, + + {view: "holdon", list: [ + {view: "preview"}, {view: "content", style: {"max-width": can.Conf("width")-240+"px"}}, + ]}, {view: ["editor", "textarea"], onkeydown: function(event) { can.onkeymap.parse(event, can, "insert"), can.Timer(10, function() { @@ -22,6 +25,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, can.onkeymap.parse(event, can, "command") }}, {type: "code", list: [{view: ["display", "pre"]}]}, + {view: "search"}, ]) msg.Option("path", can.Option("path")) @@ -108,6 +112,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }, true): init(p) }, parse: function(can, line) { var p = can.onsyntax[can.parse]; if (!p) { return } + p = can.onsyntax[p.link] || p function wrap(type, str) { return type? ''+str+'': str } p.keyword && (line = can.core.List(can.core.Split(line, p.split && p.split.space || " ", p.split && p.split.operator || "{[(|)]}"), function(item, index, array) { item = typeof item == "object"? item: {text: item}, p.word && (item = p.word(item, index, array)) @@ -121,7 +126,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }).join("")) p.prefix && can.core.Item(p.prefix, function(pre, type) { - if (line.startsWith(pre)) { line = wrap(type, line) } + if (line.trim().startsWith(pre)) { line = wrap(type, line) } }) p.suffix && can.core.Item(p.suffix, function(pre, type) { if (line.endsWith(pre)) { line = wrap(type, line) } @@ -311,6 +316,63 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], return array[index-2]=="can"&&array[index-1]=="."&&(libs[value]||libs[value.text])? {keyword: "function", text: value.text||value}: value }, }, + h: { + split: { + space: " ", + operator: "{[(.:,;!|)]}", + }, + prefix: { + "//": "comment", + "/*": "comment", + "*": "comment", + }, + keyword: { + "#include": "keyword", + "#define": "keyword", + "#ifndef": "keyword", + "#ifdef": "keyword", + "#else": "keyword", + "#endif": "keyword", + + "typedef": "keyword", + + "if": "keyword", + "else": "keyword", + "for": "keyword", + "while": "keyword", + "do": "keyword", + "range": "keyword", + "break": "keyword", + "continue": "keyword", + "switch": "keyword", + "case": "keyword", + "default": "keyword", + + "return": "keyword", + + "union": "datatype", + "struct": "datatype", + "extern": "datatype", + "unsigned": "datatype", + "static": "datatype", + "double": "datatype", + "const": "datatype", + "void": "datatype", + "long": "datatype", + "char": "datatype", + "int": "datatype", + + "sizeof": "function", + "assert": "function", + "zmalloc": "function", + + "NULL": "string", + "0": "string", + "1": "string", + "-1": "string", + }, + }, + c: {link: "h"}, png: { display: true, @@ -567,8 +629,12 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" }, }) Volcanos("onaction", {help: "控件交互", list: [ - "", "项目", "上传", "", "保存", "运行", - "", "提交", "记录", "复盘", "历史", + "搜索", + // "运行", "收藏", + + // "", "项目", "上传", "", "保存", "运行", + // "", "提交", "记录", "复盘", "历史", + // "", "搜索", ], modifyLine: function(can, target, value) { var p = can.onsyntax.parse(can, value) typeof p == "object"? can.page.Appends(can, target, [p]): target.innerHTML = p @@ -584,6 +650,7 @@ Volcanos("onaction", {help: "控件交互", list: [ can.page.ClassList[index==i? "add": "del"](can, item, "select") }) }); if (typeof target != "object") { return }; can.current = target + return can.page.Modify(can, can.editor, {className: "editor "+can.mode, value: can.current.innerText, style: { height: target.offsetHeight, width: target.offsetWidth, @@ -601,7 +668,9 @@ Volcanos("onaction", {help: "控件交互", list: [ can.onaction.selectLine(can, index) }}]) var line = can.page.Append(can, can.ui.content, [{view: ["item", "pre", ""], onclick: function(event) { - can.onaction.selectLine(can, line) + // can.onaction.selectLine(can, line) + }, ondblclick: function(event) { + can.onaction.searchLine(event, can, document.getSelection().toString()) }}]).first; value && can.onaction.modifyLine(can, line, value) return line }, @@ -614,6 +683,16 @@ Volcanos("onaction", {help: "控件交互", list: [ can.onaction.deleteLine(can, target.nextSibling) return target }, + searchLine: function(event, can, value) { var msg = can.request(event) + msg.Option("_path", can.Option("path")) + can.run(event, ["search", "Search.onimport.active", can.parse, value, ""], function(line) { + var ls = line.file.split("/") + can.onimport.tabview(can, ls.slice(0, -1).join("/"), ls[ls.length-1]) + can.onaction.selectLine(can, parseInt(line.line-1)) + can.current && can.current.scrollIntoView() + can.ui.holdon.scrollBy(0, -22*5) + }, true) + }, "串行": function(event, can, msg) { can.core.Next(can.page.Select(can, can._action, "div.file", function(item) { @@ -632,7 +711,29 @@ Volcanos("onaction", {help: "控件交互", list: [ can.page.Modify(can, can.ui.project, {style: {display: hide? "": "none"}}) }, "上传": function(event, can) { can.user.upload(event, can) }, - "搜索": function(event, can) { can.onkeymap._remote(event, can, "搜索", ["action", "find", "vim.history", "", "id", "type", "name", "text"]) }, + "搜索": function(event, can) { + can.onaction.searchLine(event, can, "") + return + + can.user.input(event, can, ["word"], function(event, button, meta, list) { + var msg = can.request(event) + msg.Option("_path", can.Option("path")) + can.run(event, ["action", "search", can.parse, list[0], ""], function(msg) { + can.page.Modify(can, can.ui.search, {innerHTML: "", style: {display: "block"}}) + can.onappend.table(can, can.ui.search, "table", msg, function(value, key, index, line) { + return {text: [value, "td"], onclick: function(event) { + console.log(value) + + var ls = line.file.split("/") + can.onimport.tabview(can, ls.slice(0, -1).join("/"), ls[ls.length-1]) + can.onaction.selectLine(can, parseInt(line.line-1)) + can.current && can.current.scrollIntoView() + can._target && can._target.scrollBy(0, -22*3) + }} + }) + }, true) + }) + }, "记录": function(event, can) { var sub = can.request(event) can.core.Item(can.Option(), sub.Option) sub.Option("display", can.display.innerText) @@ -651,7 +752,9 @@ Volcanos("onaction", {help: "控件交互", list: [ }, "列表": function(event, can) { can.onkeymap._remote(event, can, "收藏", ["action", "favor", "url.favor"]) }, }) -Volcanos("ondetail", {help: "菜单交互", list: ["保存", "运行", "提交", "记录", "删除行", "合并行", "插入行", "添加行", "追加行"], +Volcanos("ondetail", {help: "菜单交互", list: [ +// "保存", "运行", "提交", "记录", "删除行", "合并行", "插入行", "添加行", "追加行", + ], "删除行": function(event, can, msg) { can.onaction.deleteLine(can, can.current) }, diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index ceb5605d..af6f850d 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -10,7 +10,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, field: function(can, item, target) { var meta = can.base.Obj(item.meta) can.onappend._init(can, meta, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) { sub.run = function(event, cmds, cb, silent) { - can.run(event, ["action", "story", item.type, item.name, item.text].concat(cmds), cb, true) + can.run(event, (cmds[0] == "search"? []: ["action", "story", item.type, item.name, item.text]).concat(cmds), cb, true) } }, can._output, target) },