From 2fbaf9398a907320826bbadbc0fec2a3d5165f32 Mon Sep 17 00:00:00 2001 From: shy Date: Fri, 1 Sep 2023 15:57:00 +0800 Subject: [PATCH] add some --- const.js | 17 +++++++------- frame.js | 5 +++- index.css | 4 ++-- lib/misc.js | 8 ++++++- lib/page.js | 1 + plugin/story/editor.css | 51 +++++++++++++++++++++-------------------- plugin/story/editor.js | 48 +++++++++++++++++++++----------------- plugin/story/monaco.js | 32 +++++++++++--------------- plugin/table.js | 3 ++- proto.js | 8 ++++--- 10 files changed, 97 insertions(+), 80 deletions(-) diff --git a/const.js b/const.js index 5b636927..0181394b 100644 --- a/const.js +++ b/const.js @@ -195,7 +195,7 @@ var chat = { OUTPUT: "output", SIMPLE: "simple", FLOAT: "float", FULL: "full", CMD: "cmd", HEADER: "Header", ACTION: "Action", FOOTER: "Footer", - libs: ["base.js", "core.js", "date.js", "misc.js", "page.js", "user.js"].map(function(p) { return "/volcanos/lib/"+p }), + libs: ["base.js", "core.js", "date.js", "misc.js", "page.js", "user.js"].map(function(p) { return "/lib/"+p }), panel_list: [{name: "Header", style: "head"}, {name: "River", style: "left"}, {name: "Action", style: "main"}, {name: "Search", style: "auto"}, {name: "Footer", style: "foot"}], plugin_list: [ "state.js", @@ -216,15 +216,15 @@ var chat = { "local/wiki/word.js", "local/team/plan.js", "local/mall/goods.js", - ].map(function(p) { return "/volcanos/plugin/"+p }).concat([ + ].map(function(p) { return "/plugin/"+p }).concat([ "/require/modules/bootstrap-icons/font/bootstrap-icons.min.css", // https://icons.getbootstrap.com/ ]), - PLUGIN_LOCAL: "/volcanos/plugin/local/", - PLUGIN_STORY: "/volcanos/plugin/story/", - PLUGIN_INPUT: "/volcanos/plugin/input/", - PLUGIN_INPUT_JS: "/volcanos/plugin/input.js", - PLUGIN_TABLE_JS: "/volcanos/plugin/table.js", - PLUGIN_STATE_JS: "/volcanos/plugin/state.js", + PLUGIN_LOCAL: "/plugin/local/", + PLUGIN_STORY: "/plugin/story/", + PLUGIN_INPUT: "/plugin/input/", + PLUGIN_INPUT_JS: "/plugin/input.js", + PLUGIN_TABLE_JS: "/plugin/table.js", + PLUGIN_STATE_JS: "/plugin/state.js", FRAME_JS: "/volcanos/frame.js", ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap", @@ -308,6 +308,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, DESKTOP: "desktop", DIV_DESKTOP: "div.desktop", DIV_EXPAND: "div.expand", DIV_ITEM_SELECT: "div.item.select", DIV_TABS_SELECT: "div.tabs.select", + DIV_PROFILE: "div.profile", DIV_DISPLAY: "div.display", } var svg = { GROUP: "group", PID: "pid", GRID: "grid", diff --git a/frame.js b/frame.js index 7c4b8a44..c77f6a83 100644 --- a/frame.js +++ b/frame.js @@ -11,7 +11,9 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target}), delete(sub._history), delete(sub._conf.feature) }, target) }, function() { can.onlayout._init(can, target), can.onmotion._init(can, target), can.onkeymap._init(can, target) - can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can), can.onengine._config(can) + can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can) + return + can.onengine._config(can) }), can._path = location.href }, _config: function(can) { can.require(["/require/src/conf.js"], function() {}, function(can, name, sub) { @@ -268,6 +270,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { field: function(can, type, item, target) { type = type||html.STORY, item = item||{} var name = can.core.Split(item.nick||item.name||"").pop()||""; can.base.isIn(name, "server", "client", "studio") && (name = (item.index||"").split(".").slice(-2).join(".")), name = can.core.Keys(item.space, name) var title = item.help && item.help != name && !can.user.isEnglish(can)? name+"("+can.core.Split(item.help)[0]+")": name + target = can.base.isFunc(target)? target(): target return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{type: html.LEGEND, list: [item.icon && {icon: item.icon}, {text: title}]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}]) }, input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) } diff --git a/index.css b/index.css index 5abe36e4..2724f3f5 100644 --- a/index.css +++ b/index.css @@ -16,12 +16,12 @@ body { --status-border:var(--box-border); --panel-bg-color:var(--panel-output-bg-color); --panel-fg-color:var(--panel-output-fg-color); - --panel-output-bg-color: var(--body-bg-color); --panel-output-fg-color: var(--body-fg-color); --panel-hover-bg-color:var(--hover-bg-color); --panel-hover-fg-color:var(--hover-fg-color); --plugin-border-color:var(--box-border); --plugin-radius:10px; - --plugin-bg-color:var(--body-bg-color); + --plugin-bg-color:var(--legend-bg-color); + --panel-output-bg-color:var(--input-bg-color); --plugin-fg-color:var(--body-fg-color); --th-bg-color:var(--plugin-bg-color); --td-hover-bg-color:var(--hover-bg-color); diff --git a/lib/misc.js b/lib/misc.js index d9f100e3..3bc50991 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -126,6 +126,11 @@ Volcanos("misc", { } catch (e) { can.misc.Warn(e), msg.Reply() } }) } }, + Resource(can, path) { + if (path.indexOf(nfs.PS) == 0 || path.indexOf(ice.HTTP) == 0) { return path } + return can.base.MergeURL("/require/"+path, ice.POD, can.Conf(web.SPACE)||can.Conf(ice.POD)) + }, + Template(can, path, file) { return can.base.Path(nfs.SRC_TEMPLATE, can.ConfIndex(), path, file) }, MergePath: function(can, file, path) { return file.indexOf(nfs.PS) == 0 || file.indexOf(ice.HTTP) == 0? file: can.base.Path(path, file) }, MergeCache: function(can, hash) { return can.misc.MergeURL(can, {_path: can.base.Path(web.SHARE_CACHE, hash)}, true) }, MergePodCmd: function(can, obj) { @@ -150,7 +155,8 @@ Volcanos("misc", { for (var i = 1; i < ls.length; i += 2) { if (can.base.isIn(ls[i], [ice.POD, ice.CMD, web.WEBSITE])) { args[ls[i]] = ls[i+1] } } return args }, - SplitPath: function(can, path) { var ls = path.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] } + SplitPath: function(can, path) { + var ls = path.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] } if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] } return [ls.slice(0, 1).join(nfs.PS)+nfs.PS, ls.slice(1).join(nfs.PS)] }, diff --git a/lib/page.js b/lib/page.js index 5ace6688..3d33a2c6 100644 --- a/lib/page.js +++ b/lib/page.js @@ -207,6 +207,7 @@ Volcanos("page", { case html.A: return ""+(arg[2]||arg[1])+"" case html.IMG: return arg[2]? "": "" case html.SPAN: + arg[2] && typeof arg[2] == code.OBJECT && (arg[2] = arg[2].join(lex.SP)) return arg[2]? ""+arg[1]+"": arg[1] default: /* type inner arg... */ var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) } diff --git a/plugin/story/editor.css b/plugin/story/editor.css index 10ff0def..3f13f31e 100644 --- a/plugin/story/editor.css +++ b/plugin/story/editor.css @@ -1,41 +1,42 @@ -fieldset.can.tinymce div.tox-tinymce, -fieldset.can.tinymce div.tox:not(.tox-tinymce-inline) .tox-editor-header { +fieldset.tinymce div.tox-tinymce, +fieldset.tinymce div.tox:not(.tox-tinymce-inline) .tox-editor-header { border:none; } -fieldset.can.tinymce div.tox-promotion { display:none; } -fieldset.can.tinymce div.tox div.tox-sidebar-wrap div.tox-edit-area iframe { +fieldset.tinymce div.tox-promotion { display:none; } +fieldset.tinymce div.tox div.tox-sidebar-wrap div.tox-edit-area iframe { background-color:var(--output-bg-color); } div.tox .tox-collection--list .tox-collection__item--active, div.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled), -fieldset.can.tinymce div.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active), -fieldset.can.tinymce div.tox .tox-mbtn:focus:not(:disabled), -fieldset.can.tinymce div.tox .tox-mbtn--active, -fieldset.can.tinymce div.tox .tox-tbtn:hover { +div.tox .tox-collection--list .tox-collection__item--enabled, +fieldset.tinymce div.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active), +fieldset.tinymce div.tox .tox-mbtn:focus:not(:disabled), +fieldset.tinymce div.tox .tox-mbtn--active, +fieldset.tinymce div.tox .tox-tbtn:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.tox .tox-menu, div.tox .tox-collection__item, -fieldset.can.tinymce div.tox .tox-editor-header, -fieldset.can.tinymce div.tox .tox-menubar, -fieldset.can.tinymce div.tox .tox-toolbar, -fieldset.can.tinymce div.tox .tox-toolbar-overlord, -fieldset.can.tinymce div.tox .tox-toolbar__overflow, -fieldset.can.tinymce div.tox .tox-toolbar__primary, -fieldset.can.tinymce div.tox .tox-statusbar, -fieldset.can.tinymce div.tox .tox-statusbar__path-item, -fieldset.can.tinymce div.tox .tox-statusbar__wordcount, -fieldset.can.tinymce div.tox .tox-statusbar a, -fieldset.can.tinymce div.tox :not(svg):not(rect) { +fieldset.tinymce div.tox .tox-editor-header, +fieldset.tinymce div.tox .tox-mbtn, +fieldset.tinymce div.tox .tox-menubar, +fieldset.tinymce div.tox .tox-toolbar, +fieldset.tinymce div.tox .tox-toolbar-overlord, +fieldset.tinymce div.tox .tox-toolbar__overflow, +fieldset.tinymce div.tox .tox-toolbar__primary, +fieldset.tinymce div.tox .tox-statusbar, +fieldset.tinymce div.tox .tox-statusbar__path-item, +fieldset.tinymce div.tox .tox-statusbar__wordcount, +fieldset.tinymce div.tox .tox-statusbar a { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); } -fieldset.can.tinymce div.tox .tox-tbtn svg, -fieldset.can.tinymce div.tox .tox-tbtn:disabled svg, -fieldset.can.tinymce div.tox .tox-tbtn:disabled:hover svg, -fieldset.can.tinymce div.tox .tox-tbtn--disabled svg, -fieldset.can.tinymce div.tox .tox-tbtn--disabled:hover svg, -fieldset.can.tinymce div.tox .tox-statusbar__branding svg { +fieldset.tinymce div.tox .tox-tbtn svg, +fieldset.tinymce div.tox .tox-tbtn:disabled svg, +fieldset.tinymce div.tox .tox-tbtn:disabled:hover svg, +fieldset.tinymce div.tox .tox-tbtn--disabled svg, +fieldset.tinymce div.tox .tox-tbtn--disabled:hover svg, +fieldset.tinymce div.tox .tox-statusbar__branding svg { fill:var(--plugin-fg-color); } diff --git a/plugin/story/editor.js b/plugin/story/editor.js index 33fed3b0..803c6ff8 100644 --- a/plugin/story/editor.js +++ b/plugin/story/editor.js @@ -1,20 +1,28 @@ Volcanos(chat.ONIMPORT, { - _init: function(can, msg, cb) { can.page.requireModules(can, can.Conf("modules"), function() { - var target = can.page.Appends(can, can._output, [{type: html.TEXTAREA}])._target - can.page.style(can, can._output, html.MAX_HEIGHT, "") - tinymce.init({target: target, height: can.ConfHeight(), // menubar: false, + _init: function(can, msg, cb) { + can.require(["/require/modules/tinymce/tinymce.min.js", "/plugin/local/code/vimer.js"], function(can) { can.onimport._last_init(can, msg, function(msg) { + can.onappend.style(can, "tinymce"), cb && cb(msg) + }) }) + }, + content: function(can, text) { return can.ui.editor.setContent(text) }, + layout: function(can) { can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()) }, +}, [""]) +Volcanos(chat.ONSYNTAX, { + _split: function(can, msg, target) { + var _target = can.page.Appends(can, target, [{type: html.TEXTAREA}])._target + tinymce.init({target: _target, height: can.ConfHeight(), // menubar: false, + save_onsavecallback: function () { can.onaction.save({}, can, nfs.SAVE) }, content_style: "body#tinymce { background:transparent; color:silver; }", - toolbar: [ - [ - "code undo redo cut copy paste", - "backcolor forecolor bold italic underline strikethrough subscript superscript", - "alignleft aligncenter alignright alignjustify outdent indent", - "bullist numlist table image media link charmap", - "blockquote removeformat hr pagebreak anchor insertdatetime", - "fullscreen wordcount preview print help", - ].join("|"), - ], + toolbar: [[ + "save code undo redo cut copy paste", + "backcolor forecolor bold italic underline strikethrough subscript superscript", + "alignleft aligncenter alignright alignjustify outdent indent", + "bullist numlist table image media link charmap", + "blockquote removeformat hr pagebreak anchor insertdatetime", + "fullscreen wordcount preview print help", + ].join("|")], plugins: [ + "save", "code", "lists", "advlist", @@ -32,8 +40,7 @@ Volcanos(chat.ONIMPORT, { "preview", "help", - "save", - // "autosave", + "autosave", "codesample", "directionality", "emoticons", @@ -45,17 +52,16 @@ Volcanos(chat.ONIMPORT, { "visualblocks", "visualchars", ].join(" ") - }).then(function(list) { can.ui.editor = list[0], can.ui.editor.setContent(msg.Result()), cb && cb(msg) }) - }) }, - content: function(can, text) { return can.ui.editor.setContent(text) }, -}, [""]) + }).then(function(list) { can.ui.editor = list[0], can.ui.editor.setContent(msg.Result()) }).catch(function(err) { can.misc.Warn(err) }) + }, +}) Volcanos(chat.ONEXPORT, { content: function(can) { return can.ui.editor.getContent() }, }) Volcanos(chat.ONPLUGIN, { tinymce: shy("富文本", { save: shy(function(can, msg) { can.user.toast(can, msg.Option(nfs.CONTENT)) }), - }, [nfs.PATH, ice.LIST, nfs.SAVE], function(can, msg, meta) { + }, [nfs.PATH, nfs.FILE, nfs.LINE, ice.LIST, nfs.SAVE], function(can, msg, meta) { msg.Display(meta._path) }), }) diff --git a/plugin/story/monaco.js b/plugin/story/monaco.js index 1695d990..7ac2f190 100644 --- a/plugin/story/monaco.js +++ b/plugin/story/monaco.js @@ -1,31 +1,27 @@ Volcanos(chat.ONIMPORT, { - _init: function(can, msg, cb) { var toast = can.user.toastProcess(can) - can.page.requireModules(can, ["monaco-editor/min/vs/loader.js"], function() { + _init: function(can, msg, cb) { + can.require(["/require/modules/monaco-editor/min/vs/loader.js"], function() { require.config({paths: {vs: "/require/modules/monaco-editor/min/vs"}}) require(["vs/editor/editor.main"], function () { - can.require(["/plugin/local/code/vimer.js"], function(can) { - can.onimport._last_init(can, msg, function(msg) { - can.onappend.style(can, "monaco") - cb && cb(msg), toast.close() - }) - }) + can.require(["/plugin/local/code/vimer.js"], function(can) { can.onimport._last_init(can, msg, function(msg) { + can.onappend.style(can, "monaco"), cb && cb(msg) + }) }) }) }) }, - _theme: function(can) { - if (can.base.isIn(can.getHeaderTheme(), html.LIGHT, html.WHITE)) { - monaco.editor.setTheme("vs") - } else { - monaco.editor.setTheme("vs-dark") - } - }, + _theme: function(can) { if (can.base.isIn(can.getHeaderTheme(), html.LIGHT, html.WHITE)) { monaco.editor.setTheme("vs") } else { monaco.editor.setTheme("vs-dark") } }, + layout: function(can) { can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()), can.ui.editor && can.ui.editor.layout() }, + content: function(can, text) { return can.ui.editor.setValue(text) }, }, [""]) Volcanos(chat.ONSYNTAX, { - _split: function(can, msg, target) { can.onimport._theme(can) - can.onengine.listen(can, chat.ONTHEMECHANGE, function() { can.onimport._theme(can) }) - can.ui.editor = monaco.editor.create(target, {value: msg.Result(), language: "javascript", automaticLayout: true}) + _split: function(can, msg, target) { can.onimport._theme(can), can.onengine.listen(can, chat.ONTHEMECHANGE, function() { can.onimport._theme(can) }) + can.ui.editor = monaco.editor.create(target, {value: msg.Result(), language: "javascript", automaticLayout: true, resize: true}) + can.ui.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, function () { can.onaction.save({}, can, nfs.SAVE) }) }, }) +Volcanos(chat.ONEXPORT, { + content: function(can) { return can.ui.editor.getValue() }, +}) Volcanos(chat.ONPLUGIN, { monaco: shy("编辑器", { save: shy(function(can, msg) { can.user.toast(can, msg.Option(nfs.CONTENT)) }), diff --git a/plugin/table.js b/plugin/table.js index 57ef1ea8..6888fe0c 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -113,7 +113,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }}, "", target) }, item: function(can, item, cb, cbs, target) { target = target||(can.ui && can.ui.project? can.ui.project: can._output) - var ui = can.page.Append(can, target, [{view: html.ITEM, list: [{icon: item.icon}, {text: item.nick||item.name||item.zone}], title: item.title, onclick: function(event) { + var ui = can.page.Append(can, target, [{view: html.ITEM, list: [item.icon && {icon: item.icon}, {text: item.nick||item.name||item.zone}], title: item.title, onclick: function(event) { can.onmotion.select(can, target, html.DIV_ITEM, event.currentTarget) cb(event, event.currentTarget, event.currentTarget._list && can.onmotion.toggle(can, event.currentTarget._list)) }, oncontextmenu: function(event) { @@ -230,6 +230,7 @@ Volcanos(chat.ONKEYMAP, { Enter: shy("执行操作", function(event, can) { can.onaction.enter(event, can) }), " ": shy("搜索项目", function(event, can) { can.ui.filter && (can.ui.filter.focus(), can.onkeymap.prevent(event)) }), f: shy("搜索项目", function(event, can) { can.ui.filter && (can.ui.filter.focus(), can.onkeymap.prevent(event)) }), + a: shy("展示项目", function(event, can) { can.ui && can.ui.project && (can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can)) }), v: shy("展示预览", function(event, can) { can.ui && can.ui.profile && (can.onmotion.toggle(can, can.ui.profile), can.onimport.layout(can)) }), r: shy("展示输出", function(event, can) { can.ui && can.ui.display && (can.onmotion.toggle(can, can.ui.display), can.onimport.layout(can)) }), p: shy("添加插件", function(event, can) { can.sup.onaction["添加工具"](event, can.sup) }), diff --git a/proto.js b/proto.js index 42a04216..7b7feee9 100644 --- a/proto.js +++ b/proto.js @@ -12,7 +12,7 @@ var Volcanos = shy({ var Config = name; name = Config.name||ice.CAN, _can_name = "" meta.iceberg = Config.iceberg||meta.iceberg, meta.volcano = Config.volcano||meta.volcano meta.libs = (Config.libs||chat.libs).concat(Config.list), panels = Config.panels||chat.panel_list, delete(Config.panels) - libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/volcanos/panel/"+p.name+nfs._JS, "/volcanos/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugins||chat.plugin_list) + libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._JS, "/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugins||chat.plugin_list) cb = can||function(can) { can.require([can.frame], function() { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) @@ -39,11 +39,13 @@ var Volcanos = shy({ if (libs[0][0] != nfs.PS && libs[0].indexOf(web.HTTP) != 0) { libs[0] = can._path.slice(0, can._path.lastIndexOf(ice.PS)+1)+libs[0] } var name = (libs[0].indexOf(web.HTTP) == 0 || libs[0].indexOf("?pod=") > -1? libs[0]: libs[0].split(ice.QS)[0]).toLowerCase() function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) } - if (meta.cache[name] || name == "") { return next() } + if (name.indexOf("/lib/") == 0) { name = "/volcanos"+name } + if (name.indexOf("/panel/") == 0) { name = "/volcanos"+name } if (name.indexOf("/plugin/") == 0) { name = "/volcanos"+name } if (name.indexOf("/volcanos/") == 0 && meta.volcano) { name = meta.volcano+name } if (name.indexOf("/require/") == 0 && meta.iceberg) { name = meta.iceberg+name } - meta._load(name, next) + // meta.cache[name] || name == ""? next(): meta._load(name, next) + meta.cache[name]? next(): meta._load(name, next) }, requestPodCmd: function(event) { return can.request(event, {space: can.Conf(web.SPACE), index: can.Conf(ctx.INDEX)}) }, request: function(event) { event = event||{}, event = event._event||event