diff --git a/const.js b/const.js index 0ca1e119..5b636927 100644 --- a/const.js +++ b/const.js @@ -217,8 +217,7 @@ var chat = { "local/team/plan.js", "local/mall/goods.js", ].map(function(p) { return "/volcanos/plugin/"+p }).concat([ - // https://icons.getbootstrap.com/ - "/require/modules/bootstrap-icons/font/bootstrap-icons.min.css", + "/require/modules/bootstrap-icons/font/bootstrap-icons.min.css", // https://icons.getbootstrap.com/ ]), PLUGIN_LOCAL: "/volcanos/plugin/local/", PLUGIN_STORY: "/volcanos/plugin/story/", @@ -293,7 +292,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, NOTICE: "notice", DANGER: "danger", SIZE: "size", OPACITY: "opacity", VISIBLE: "visible", - CLASS: "class", LIGHT: "light", DARK: "dark", + CLASS: "class", DARK: "dark", LIGHT: "light", WHITE: "white", BLACK: "black", FILTER: "filter", TOGGLE: "toggle", EXPAND: "expand", SPEED: "speed", HOVER: "hover", HOVER_SELECT: "hover,select", NOT_HIDE: ":not(.hide)", diff --git a/frame.js b/frame.js index 3b005d98..7c4b8a44 100644 --- a/frame.js +++ b/frame.js @@ -11,9 +11,21 @@ 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.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can), can.onengine._config(can) }), can._path = location.href }, + _config: function(can) { can.require(["/require/src/conf.js"], function() {}, function(can, name, sub) { + name == chat.ONIMPORT && can.core.Item(sub.list, function(path, meta) { + can.require([path], function() {}, function(can, name, sub) { + name == chat.ONPLUGIN && can.core.Item(sub, function(key, cmd) { + if (sub.hasOwnProperty(key) && can.base.isFunc(cmd)) { + cmd.meta._path = sub._path, can.base.Copy(cmd.meta, meta) + can.onengine.plugin(can, can.core.Keys(ice.CAN, key), cmd) + } + }) + }) + }) + }) }, _search: function(event, can, msg, panel, cmds, cb) { var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split(nfs.PT), function(value) { fun && (sub = mod, mod = fun, fun = mod[value], key = value) }) if (!sub || !mod || !fun) { can.misc.Warn(ice.ErrNotFound, cmds); return can.base.isFunc(cb) && cb(msg.Echo(ice.ErrWarn, ice.ErrNotFound, cmds)) } @@ -42,13 +54,13 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { _engine: function(event, can, msg, panel, cmds, cb) { return false }, _plugin: function(event, can, msg, panel, cmds, cb) { if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN) { var p = can.onengine.plugin(can, cmds[2]) - if (p) { return can.core.CallFunc(p, {can: p.can||panel, sub: msg._can, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb}), true } + if (p) { return can.core.CallFunc(p, {can: p.can||panel, sub: msg._can, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb, meta: p.meta}), true } } var p = can.onengine.plugin(can, cmds[0]), n = 1; if (!p) { return false } var func = p, _can = p.can||panel, _sup = _can if (p.meta && p.meta[cmds[2]] && cmds[1] == ctx.ACTION) { n = 3, func = p.meta[cmds[2]], _can = msg._can } else if (p.meta && p.meta[cmds[1]]) { n = 2, func = p.meta[cmds[2]], _can = msg._can } if (cmds[n] == ctx.ACTION && cmds[n+1] == mdb.INPUTS) { return true } - return can.core.CallFunc(func, {sup: _sup, can: _can, sub: msg._can, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb}), true + return can.core.CallFunc(func, {sup: _sup, can: _can, sub: msg._can, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb, meta: p.meta}), true }, plugin: shy(function(can, name, command) { var _name = can.base.trimPrefix(name, "can.") if (can.base.isUndefined(name) || !can.base.isString(name) || name == _name) { return } @@ -230,16 +242,18 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { if (sub.onimport && can.base.isArray(sub.onimport.list) && sub.onimport.list.length > 0) { can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) }) } - can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { - if (action !== false) { can.onkeymap._build(sub) - can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) - sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) - } - can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output) - if (can.onimport.size) { if (can.isFullMode() || can.isCmdMode()) { can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } - can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), can.Conf("_auto"), can.Mode()), can.onexport.output(sub, msg) - } can.base.isFunc(cb) && cb(msg) - }, target: output}) + can.page.requireModules(can, can.Conf("modules"), function() { + can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { + if (action !== false) { can.onkeymap._build(sub) + can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) + sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) + } + can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output) + if (can.onimport.size) { if (can.isFullMode() || can.isCmdMode()) { can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } + can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), can.Conf("_auto"), can.Mode()), can.onexport.output(sub, msg) + } can.base.isFunc(cb) && cb(msg) + }, target: output}) + }) }) }, _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) @@ -254,7 +268,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 - return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{type: html.LEGEND, list: [{icon: item.icon}, {text: title}]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}]) + 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]) } var icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value) @@ -344,7 +358,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { target.scrollHeight > target.offsetHeight && can.page.style(can, vbar, html.HEIGHT, height, html.RIGHT, -target.scrollLeft, html.VISIBILITY, html.VISIBLE, html.TOP, target.scrollTop+target.scrollTop/(target.scrollHeight-target.offsetHeight)*(target.offsetHeight-height), ) - vbar.innerHTML = `${target.scrollTop}+${target.offsetHeight}/${target.scrollHeight}` + vbar.innerHTML = `${parseInt(target.scrollTop)}+${target.offsetHeight}/${target.scrollHeight}` var width = can.base.Min(target.offsetWidth*target.offsetWidth/target.scrollWidth, target.offsetWidth/4) target.scrollWidth > target.offsetWidth && can.page.style(can, hbar, html.WIDTH, width, html.BOTTOM, -target.scrollTop, html.VISIBILITY, html.VISIBLE, html.LEFT, target.scrollLeft+target.scrollLeft/(target.scrollWidth-target.offsetWidth)*(target.offsetWidth-width), @@ -604,6 +618,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { } can.onimport.size(can, height, width, true) can.onmotion.move(can, can._target, {left: can.page.width()-width, top: can.page.height()/4}) + can.onmotion.resize(can, can._target, function(height, width) { can.onimport.size(can, height, width, true) }) }, clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), target }, cache: function(can, next) { var list = can.base.getValid(can.base.Obj(can.core.List(arguments).slice(2)), [can._output]) @@ -667,7 +682,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { can.core.Timer({interval: 1, length: height/6}, function(timer, interval, index, list) { can.page.style(can, target, html.HEIGHT, begin += height/list.length) }, function() { - can.page.style(can, target, html.HEIGHT, height) + can.page.style(can, target, html.HEIGHT, "") }) }, slideDown: function(can, target) { diff --git a/index.css b/index.css index fb3c47e5..5abe36e4 100644 --- a/index.css +++ b/index.css @@ -36,8 +36,9 @@ body { --code-comment:green; --code-keyword:royalblue; --code-package:blue; --code-datatype:lavender; --code-function:lightgreen; --code-constant:gray; --code-string:orange; --code-object:silver; - --svg-stroke-width:2; + --svg-stroke-width:1; } +body.windows { --code-font-family:courier new; } /* element */ * { tab-size:4; box-sizing:border-box; padding:0; border:0; margin:0; } legend { padding:0 20px; } @@ -69,7 +70,7 @@ hr, td.hr { border-bottom:var(--plugin-border-color) dashed 1px; margin:5px; } ol, ul { margin-left:40px; } a { color:var(--body-fg-color); font-style:italic; } p { margin:20px 0; } -kbd { padding:0 5px; } +kbd { padding:0 5px; font-family:var(--code-font-family); } img, iframe { margin-bottom:-3px; } iframe { height:420px; width:100%; } /* fieldset */ @@ -241,7 +242,7 @@ div.content>div.toggle.project { top:20%; left:0; height:80px; width:unset; padd div.content>div.toggle.profile { top:20%; right:0; height:80px; padding-top:25px; transform:scale(1, 3); border:none; } div.content>div.toggle.display { left:20%; bottom:0; width:80px; text-align:center; transform:scale(3, 1); border:none; } div.project:not(.toggle) { border-right:var(--box-border); width:230px; flex:0 0 230px; } -div.profile:not(.toggle) { border-left:var(--box-border); min-width:230px; } +div.profile:not(.toggle) { border-left:var(--box-border); width:50%; } div.display:not(.toggle) { border-top:var(--box-border); } /* table card */ div.output.card>div.item.stop { color:var(--disable-fg-color); } @@ -269,7 +270,7 @@ fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-inde fieldset.plug { position:absolute; bottom:0; right:0; } div.output { position:relative; } div.layout.flex>* { float:left; clear:none; } -div.output.flex { display:flex; } +div.output.flex { display:flex; overflow:hidden; } div.output>div.code { position:sticky; left:0; } fieldset>div.status>legend { border-radius:0; border-bottom-left-radius:10px; border-bottom-right-radius:10px; box-shadow:var(--box-shadow); @@ -589,5 +590,4 @@ body { --ui-gold-8: #ad6800; --ui-gold-9: #874d00; --ui-gold-10: #613400; - } diff --git a/lib/page.js b/lib/page.js index e8679780..5ace6688 100644 --- a/lib/page.js +++ b/lib/page.js @@ -322,7 +322,7 @@ Volcanos("page", { case html.BUTTON: item.value = item.value||item.name||mdb.LIST; break } return input }, - requireModules: function(can, libs, cb, cbs) { + requireModules: function(can, libs, cb, cbs) { if (!libs || libs.length == 0) { return cb && cb() } for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(nfs.PS) == 0 || libs[i].indexOf(ice.HTTP) == 0) { continue } if (libs[i].indexOf(nfs._CSS) == -1 && libs[i].indexOf(nfs._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+nfs._JS } libs[i] = "/require/modules/"+libs[i] diff --git a/plugin/local/chat/iframe.js b/plugin/local/chat/iframe.js index 9f4fcc62..0db41a09 100644 --- a/plugin/local/chat/iframe.js +++ b/plugin/local/chat/iframe.js @@ -1,9 +1,9 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.current = msg.TableDetail(), can.sup.onimport.size(can.sup, can.sup.ConfHeight(), can.sup.ConfWidth(), true) - can.target = can.page.Appends(can, can._output, [{type: html.IFRAME, src: can.current.link, height: can.ConfHeight(), width: can.ConfWidth(), style: {border: 0}}])._target - can.onimport.layout(can) +Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.db.current = msg.TableDetail() + can.ui.target = can.page.Appends(can, can._output, [{type: html.IFRAME, src: can.db.current.link, height: can.ConfHeight()-1, width: can.ConfWidth()}])._target }, - layout: function(can) { var item = can.current; can.sup.onexport.title(can, item.name||item.link.split(mdb.QS)[0]) - can.page.style(can, can.target, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()) + layout: function(can) { + var item = can.db.current; can.sup.onexport.title(can, item.name||item.link.split(mdb.QS)[0]) + can.page.style(can, can.ui.target, html.HEIGHT, can.ConfHeight()-1, html.WIDTH, can.ConfWidth()) }, }) -Volcanos(chat.ONACTION, {open: function(event, can) { can.user.open(can.current.link) }}) +Volcanos(chat.ONACTION, {open: function(event, can) { can.user.open(can.db.current.link) }}) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 10a7e0fe..d95289f4 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -13,20 +13,18 @@ fieldset.inner>div.output>div.project div.zone>div.item span.icon { font-size:22 fieldset.inner>div.output>div.project div.zone:hover>div.item span.icon { display:block; } fieldset.inner>div.output>div.project div.zone div.action { width:100%; } fieldset.inner>div.output>div.project div.zone div.action>div.item { padding-right:0; width:100%; } -fieldset.inner>div.output>div.project div.zone div.action>div.item>i { position:absolute; padding:5px; } +fieldset.inner>div.output>div.project div.zone div.action>div.item>i { position:absolute; padding:4px; } fieldset.inner>div.output>div.project div.zone div.action>div.item>input { padding-left:25px; width:100%; } fieldset.inner>div.output>div.project div.zone div.action>div.item>span.delete { font-size:20px; } fieldset.inner>div.output>div.project { box-shadow:var(--box-shadow); } fieldset.inner>div.output>div.layout>div.display { box-shadow:var(--box-shadow); } fieldset.inner>div.output>div.layout>div.layout>div.profile { box-shadow:var(--box-shadow); } -fieldset.inner>div.output>div.project * { font-family:var(--code-font-family); font-size:var(--code-font-size); } -fieldset.inner>div.output>div.layout>div.tabs { font-family:var(--code-font-family); font-size:var(--code-font-size); display:none; } +fieldset.inner>div.output>div.layout>div.tabs { font-size:var(--code-font-size); display:none; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs { padding-right:0; box-shadow:var(--box-shadow); margin-left:5px; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); border-top-left-radius:10px; border-top-right-radius:10px; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); border-top-left-radius:10px; border-top-right-radius:10px; border-bottom:lightgray solid 2px; } -fieldset.inner>div.output>div.layout>div.path { font-family:var(--code-font-family); font-size:var(--code-font-size); display:none; } +fieldset.inner>div.output>div.layout>div.path { font-size:var(--code-font-size); display:none; } fieldset.inner>div.output>div.layout>div.layout>iframe.profile { border-left:var(--box-border); } -fieldset.inner>div.output>div.layout>div.layout>div.content * { font-family:var(--code-font-family); font-size:var(--code-font-size); } fieldset.inner>div.output>div.layout>div.layout>div.profile h1 { text-align:left; padding:10px 0; border-bottom:var(--box-border); margin:20px 0; } fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { padding:10px 0; border-bottom:var(--box-border); margin:20px 0; } fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { padding-left:10px; border-left:var(--code-border-color) solid 5px; display:block; } @@ -65,3 +63,8 @@ tr.line>td.line { user-select:none; } tr.line>td.line { text-align:right; padding:0 10px; position:sticky; left:0; } tr.line>td.text { white-space:pre; line-height:20px; padding-left:10px; width:100%; } tr.line:hover { background-color:var(--hover-bg-color); } + +fieldset.inner:not(.monaco)>div.output>div.layout>div.layout>div.content * { font-family:var(--code-font-family); font-size:var(--code-font-size); } +body:not(.windows) fieldset.inner>div.output>div.project * { font-family:var(--code-font-family); font-size:var(--code-font-size); } +body:not(.windows) fieldset.inner>div.output>div.layout>div.tabs { font-family:var(--code-font-family); font-size:var(--code-font-size); } +body:not(.windows) fieldset.inner>div.output>div.layout>div.path { font-family:var(--code-font-family); font-size:var(--code-font-size); } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 318b14f9..ec977932 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -330,6 +330,9 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport. } var content = can.ui.content; if (content._root) { can.onmotion.cache(can, function() { return key }, content) } if (can.onexport.parse(can) == nfs.SVG) { msg.Option(ctx.INDEX, web.WIKI_DRAW+mdb.FS+path+file) } if (msg.Option(ctx.INDEX)) { return can.onsyntax._index(can, msg, function(target) { can.ui.content = target, cb(msg._content = content._root? (target._root = content._root): target) }, content._root? content: can.ui._profile.parentNode) } + can.onsyntax._split(can, msg, content, cb, key) + }, + _split: function(can, msg, content, cb, key) { function show(p) { p && p.include && can.core.List(p.include, function(from) { p.keyword = p.keyword||{}, can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key] || value }) diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 92994c86..e3e37766 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,8 +1,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { - can.require(["inner.js"], function(can) { can.onimport._last_init(can, msg, function() { + can.require(["/plugin/local/code/inner.js"], function(can) { can.onimport._last_init(can, msg, function() { can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) }) - can.db.undo = [], can.db.redo = [], can.onimport._input(can), can.base.isFunc(cb) && cb(msg) - }) }, function(can, mod, sub) { mod == chat.ONIMPORT && (can[mod]._last_init = sub._init) }) + can.db.undo = [], can.db.redo = [], can.onimport._input(can), cb && cb(msg) + }) }) }, _input: function(can) { var ui = can.page.Append(can, can.ui.content.parentNode, [ {view: [code.CURRENT, html.INPUT], spellcheck: false, onkeydown: function(event) { can.onimport._value(can); if (event.metaKey) { return } diff --git a/plugin/story/editor.css b/plugin/story/editor.css new file mode 100644 index 00000000..10ff0def --- /dev/null +++ b/plugin/story/editor.css @@ -0,0 +1,41 @@ +fieldset.can.tinymce div.tox-tinymce, +fieldset.can.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 { + 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 { + 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) { + 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 { + fill:var(--plugin-fg-color); +} diff --git a/plugin/story/editor.js b/plugin/story/editor.js new file mode 100644 index 00000000..33fed3b0 --- /dev/null +++ b/plugin/story/editor.js @@ -0,0 +1,61 @@ +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, + 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("|"), + ], + plugins: [ + "code", + "lists", + "advlist", + "table", + "image", + "media", + "link", + "insertdatetime", + "charmap", + "anchor", + "pagebreak", + + "fullscreen", + "wordcount", + "preview", + "help", + + "save", + // "autosave", + "codesample", + "directionality", + "emoticons", + "importcss", + "font_size", + "autolink", + "nonbreaking", + "searchreplace", + "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) }, +}, [""]) +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) { + msg.Display(meta._path) + }), +}) diff --git a/plugin/story/monaco.css b/plugin/story/monaco.css new file mode 100644 index 00000000..8a92f67d --- /dev/null +++ b/plugin/story/monaco.css @@ -0,0 +1,6 @@ +fieldset.monaco .monaco-editor, +fieldset.monaco .monaco-editor .margin, +fieldset.monaco .monaco-editor-background, +fieldset.monaco .monaco-diff-editor { + background-color:var(--output-bg-color); +} diff --git a/plugin/story/monaco.js b/plugin/story/monaco.js new file mode 100644 index 00000000..1695d990 --- /dev/null +++ b/plugin/story/monaco.js @@ -0,0 +1,35 @@ +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() { + 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() + }) + }) + }) + }) + }, + _theme: function(can) { + if (can.base.isIn(can.getHeaderTheme(), html.LIGHT, html.WHITE)) { + monaco.editor.setTheme("vs") + } else { + monaco.editor.setTheme("vs-dark") + } + }, +}, [""]) +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}) + }, +}) +Volcanos(chat.ONPLUGIN, { + monaco: shy("编辑器", { + save: shy(function(can, msg) { can.user.toast(can, msg.Option(nfs.CONTENT)) }), + }, [nfs.PATH, nfs.FILE, nfs.LINE, ice.LIST, nfs.SAVE], function(can, msg, meta) { + msg.Display(meta._path) + }), +}) diff --git a/proto.js b/proto.js index 03b27e52..42a04216 100644 --- a/proto.js +++ b/proto.js @@ -22,8 +22,10 @@ var Volcanos = shy({ } can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name, _load: function(name, cbs) { var cache = meta.cache[name]||[] for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub), sub._path = sub._path||name } meta.cache[name] = cache - cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == code.FUNCTION && cbs(can, name, sub)) { return } - can[name] = can[name]||{}; for (var k in sub) { can[name].hasOwnProperty(k) || sub.hasOwnProperty(k) && (can[name][k] = sub[k]) } + cache.forEach(function(sub) { var name = sub._name + if (typeof cbs == code.FUNCTION && cbs(can, name, sub)) { return } + can[name] = can[name]||{}, name == chat.ONIMPORT && (can[name]._last_init = sub._init) + for (var k in sub) { can[name].hasOwnProperty(k) || sub.hasOwnProperty(k) && (can[name][k] = sub[k]) } }) }, require: function(libs, cb, cbs) { @@ -38,6 +40,7 @@ var Volcanos = shy({ 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("/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)