@maketribe/ms-app 3.2.43 → 3.2.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/cjs/components/basic/lexical-editor/assets/doc-editor.css.js +1 -1
  2. package/dist/cjs/components/basic/lexical-editor/assets/doc-editor.css.js.map +1 -1
  3. package/dist/cjs/components/basic/lexical-editor/composables/lexicalEditor.js +7 -9
  4. package/dist/cjs/components/basic/lexical-editor/composables/lexicalEditor.js.map +1 -1
  5. package/dist/cjs/components/basic/lexical-editor/nodes/ImageNode.js +6 -0
  6. package/dist/cjs/components/basic/lexical-editor/nodes/ImageNode.js.map +1 -1
  7. package/dist/cjs/components/basic/lexical-editor/nodes/Template.js.map +1 -1
  8. package/dist/cjs/components/basic/lexical-editor/plugins/AutoFocusPlugin.vue.js.map +1 -1
  9. package/dist/cjs/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue.js +1 -1
  10. package/dist/cjs/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue3.js +1 -1
  11. package/dist/cjs/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue3.js.map +1 -1
  12. package/dist/cjs/components/basic/lexical-editor/plugins/RichTextEditorPlugin.js +4 -2
  13. package/dist/cjs/components/basic/lexical-editor/plugins/RichTextEditorPlugin.js.map +1 -1
  14. package/dist/cjs/style.css +4 -4
  15. package/dist/esm/components/basic/lexical-editor/assets/doc-editor.css.js +1 -1
  16. package/dist/esm/components/basic/lexical-editor/assets/doc-editor.css.js.map +1 -1
  17. package/dist/esm/components/basic/lexical-editor/composables/lexicalEditor.js +8 -10
  18. package/dist/esm/components/basic/lexical-editor/composables/lexicalEditor.js.map +1 -1
  19. package/dist/esm/components/basic/lexical-editor/nodes/ImageNode.js +6 -0
  20. package/dist/esm/components/basic/lexical-editor/nodes/ImageNode.js.map +1 -1
  21. package/dist/esm/components/basic/lexical-editor/nodes/Template.js.map +1 -1
  22. package/dist/esm/components/basic/lexical-editor/plugins/AutoFocusPlugin.vue.js.map +1 -1
  23. package/dist/esm/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue.js +1 -1
  24. package/dist/esm/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue3.js +1 -1
  25. package/dist/esm/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue3.js.map +1 -1
  26. package/dist/esm/components/basic/lexical-editor/plugins/RichTextEditorPlugin.js +5 -3
  27. package/dist/esm/components/basic/lexical-editor/plugins/RichTextEditorPlugin.js.map +1 -1
  28. package/dist/esm/style.css +4 -4
  29. package/dist/types/components/basic/lexical-editor/nodes/ImageNode.d.ts +5 -1
  30. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
- const DocEditorCss = ' \r\n.mk-doc__embedBlock {\r\n position: relative;\r\n z-index: 1;\r\n padding: 1px;\r\n cursor: pointer;\r\n}\r\n\r\n.mk-doc__embedBlock >*{ pointer-events: none; }\r\n\r\n/* 清除浮动 */\r\n.mk-doc-editor-stage::after{\r\n content: "";\r\n display: block;\r\n clear: both;\r\n width: 0;\r\n height: 0;\r\n font-size: 0;\r\n}\r\n/* 缩进 */\r\n.mk-doc-editor-stage * {\r\n --lexical-indent-base-value:2em\r\n}\r\n/* 光标样式 */\r\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\r\n.mk-doc__empty-mark::before,\r\n.mk-doc__br-brfore-mark::after{ \r\n content: "↩︎";\r\n color: #ccc;\r\n margin-left: 4px;\r\n cursor: text;\r\n user-select: none;\r\n pointer-events: none;\r\n position: absolute;\r\n font-size: 12px;\r\n height: 0;\r\n width: 1px; \r\n vertical-align: middle;\r\n}\r\n\r\n/* placeholder 模式 */\r\n.mk-doc-editor-stage.placeholder *::after,\r\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\r\n\r\n/* 选中样式 */\r\n.mk-doc__node-selection {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n/* hover 的标识线条 */\r\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\r\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\r\n outline: 1px solid #d7e6ff;\r\n}\r\n.mk-doc__image-text-warp p:hover,\r\n.mk-doc__image-text-warp section:hover,\r\n.mk-doc__image-text-warp div:hover,\r\n[data-lexical-decorator]:hover {\r\n outline: none !important;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]{\r\n user-select: none;\r\n white-space: initial;\r\n word-break: initial;\r\n cursor: pointer;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]>* {\r\n pointer-events: none;\r\n}\r\n\r\n/* 模块容器 */\r\n.mk-doc__module-grid{\r\n cursor: pointer;\r\n}\r\n ';
2
+ const DocEditorCss = ' \r\n.mk-doc__embedBlock {\r\n position: relative;\r\n z-index: 1;\r\n padding: 1px;\r\n cursor: pointer;\r\n}\r\n\r\n.mk-doc__embedBlock >*{ pointer-events: none; }\r\n\r\n/* 清除浮动 */\r\n.mk-doc-editor-stage::after{\r\n content: "";\r\n display: block;\r\n clear: both;\r\n width: 0;\r\n height: 0;\r\n font-size: 0;\r\n}\r\n/* 缩进 */\r\n.mk-doc-editor-stage * {\r\n --lexical-indent-base-value:2em\r\n}\r\n/* 光标样式 */\r\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\r\n.mk-doc__empty-mark::before,\r\n.mk-doc__br-brfore-mark::after{ \r\n content: "↩︎";\r\n color: #ccc;\r\n margin-left: 4px;\r\n cursor: text;\r\n user-select: none;\r\n pointer-events: none;\r\n position: absolute;\r\n font-size: 12px;\r\n height: 0;\r\n width: 1px; \r\n vertical-align: middle;\r\n}\r\n\r\n/* placeholder 模式 */\r\n.mk-doc-editor-stage.placeholder *::after,\r\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\r\n\r\n/* 选中样式 */\r\n.mk-doc__node-selection {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n/* hover 的标识线条 */\r\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\r\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\r\n outline: 1px solid #d7e6ff;\r\n}\r\n.mk-doc__image-text-warp p:hover,\r\n.mk-doc__image-text-warp section:hover,\r\n.mk-doc__image-text-warp div:hover,\r\n[data-lexical-decorator]:hover {\r\n outline: none !important;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]{\r\n user-select: none;\r\n white-space: initial;\r\n word-break: initial;\r\n cursor: pointer;\r\n}\r\n.mk-doc-editor-stage p>img ~ span[data-lexical-text]{\r\n display: inline-block;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]>* {\r\n pointer-events: none;\r\n}\r\n';
3
3
  module.exports = DocEditorCss;
4
4
  //# sourceMappingURL=doc-editor.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doc-editor.css.js","sources":["../../../../../../src/components/basic/lexical-editor/assets/doc-editor.css?raw"],"sourcesContent":["export default \" \\r\\n.mk-doc__embedBlock {\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n padding: 1px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.mk-doc__embedBlock >*{ pointer-events: none; }\\r\\n\\r\\n/* 清除浮动 */\\r\\n.mk-doc-editor-stage::after{\\r\\n content: \\\"\\\";\\r\\n display: block;\\r\\n clear: both;\\r\\n width: 0;\\r\\n height: 0;\\r\\n font-size: 0;\\r\\n}\\r\\n/* 缩进 */\\r\\n.mk-doc-editor-stage * {\\r\\n --lexical-indent-base-value:2em\\r\\n}\\r\\n/* 光标样式 */\\r\\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\\r\\n.mk-doc__empty-mark::before,\\r\\n.mk-doc__br-brfore-mark::after{ \\r\\n content: \\\"↩︎\\\";\\r\\n color: #ccc;\\r\\n margin-left: 4px;\\r\\n cursor: text;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n position: absolute;\\r\\n font-size: 12px;\\r\\n height: 0;\\r\\n width: 1px; \\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n/* placeholder 模式 */\\r\\n.mk-doc-editor-stage.placeholder *::after,\\r\\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\\r\\n\\r\\n/* 选中样式 */\\r\\n.mk-doc__node-selection {\\r\\n outline: 2px solid rgb(60, 132, 244);\\r\\n}\\r\\n/* hover 的标识线条 */\\r\\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\\r\\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\\r\\n outline: 1px solid #d7e6ff;\\r\\n}\\r\\n.mk-doc__image-text-warp p:hover,\\r\\n.mk-doc__image-text-warp section:hover,\\r\\n.mk-doc__image-text-warp div:hover,\\r\\n[data-lexical-decorator]:hover {\\r\\n outline: none !important;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]{\\r\\n user-select: none;\\r\\n white-space: initial;\\r\\n word-break: initial;\\r\\n cursor: pointer;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]>* {\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n/* 模块容器 */\\r\\n.mk-doc__module-grid{\\r\\n cursor: pointer;\\r\\n}\\r\\n \""],"names":[],"mappings":";AAAA,MAAe,eAAA;;"}
1
+ {"version":3,"file":"doc-editor.css.js","sources":["../../../../../../src/components/basic/lexical-editor/assets/doc-editor.css?raw"],"sourcesContent":["export default \" \\r\\n.mk-doc__embedBlock {\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n padding: 1px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.mk-doc__embedBlock >*{ pointer-events: none; }\\r\\n\\r\\n/* 清除浮动 */\\r\\n.mk-doc-editor-stage::after{\\r\\n content: \\\"\\\";\\r\\n display: block;\\r\\n clear: both;\\r\\n width: 0;\\r\\n height: 0;\\r\\n font-size: 0;\\r\\n}\\r\\n/* 缩进 */\\r\\n.mk-doc-editor-stage * {\\r\\n --lexical-indent-base-value:2em\\r\\n}\\r\\n/* 光标样式 */\\r\\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\\r\\n.mk-doc__empty-mark::before,\\r\\n.mk-doc__br-brfore-mark::after{ \\r\\n content: \\\"↩︎\\\";\\r\\n color: #ccc;\\r\\n margin-left: 4px;\\r\\n cursor: text;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n position: absolute;\\r\\n font-size: 12px;\\r\\n height: 0;\\r\\n width: 1px; \\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n/* placeholder 模式 */\\r\\n.mk-doc-editor-stage.placeholder *::after,\\r\\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\\r\\n\\r\\n/* 选中样式 */\\r\\n.mk-doc__node-selection {\\r\\n outline: 2px solid rgb(60, 132, 244);\\r\\n}\\r\\n/* hover 的标识线条 */\\r\\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\\r\\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\\r\\n outline: 1px solid #d7e6ff;\\r\\n}\\r\\n.mk-doc__image-text-warp p:hover,\\r\\n.mk-doc__image-text-warp section:hover,\\r\\n.mk-doc__image-text-warp div:hover,\\r\\n[data-lexical-decorator]:hover {\\r\\n outline: none !important;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]{\\r\\n user-select: none;\\r\\n white-space: initial;\\r\\n word-break: initial;\\r\\n cursor: pointer;\\r\\n}\\r\\n.mk-doc-editor-stage p>img ~ span[data-lexical-text]{\\r\\n display: inline-block;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]>* {\\r\\n pointer-events: none;\\r\\n}\\r\\n\""],"names":[],"mappings":";AAAA,MAAe,eAAA;;"}
@@ -14,7 +14,7 @@ require("@lexical/overflow");
14
14
  require("@lexical/text");
15
15
  require("@lexical/link");
16
16
  require("@lexical/rich-text");
17
- const useElementBlockSelection = require("./useElementBlockSelection.js");
17
+ require("./useElementBlockSelection.js");
18
18
  const LexicalEditorProviderKey = "LexicalEditorProviderKey";
19
19
  const HISTORY_MERGE_OPTIONS = { tag: "history-merge" };
20
20
  const EditorPlugins = [];
@@ -57,11 +57,12 @@ const useLexicalEditor = function(options, errHandle) {
57
57
  shortcutTools.push(...plugins.map((p) => p.plugin.shortcutTools ? p.plugin.shortcutTools(editor) : []).reduce((a, b) => a.concat(b)));
58
58
  utils.useMounted(() => {
59
59
  return utils$1.mergeRegister(
60
- // 焦点移除
61
- editor.registerCommand(lexical.BLUR_COMMAND, (event) => {
62
- useElementBlockSelection.setSelected(editor, true, lexical.$getRoot().__key);
63
- return false;
64
- }, 1),
60
+ // // 焦点移除
61
+ // editor.registerCommand<FocusEvent>(BLUR_COMMAND,(event:FocusEvent) => {
62
+ // // 选中根
63
+ // // setSelected(editor,true,$getRoot().__key)
64
+ // return false;
65
+ // }, 1),
65
66
  // 补空
66
67
  editor.registerUpdateListener(({ editorState }) => {
67
68
  editor.update(() => {
@@ -112,9 +113,6 @@ const useLexicalEditor = function(options, errHandle) {
112
113
  } else {
113
114
  root.append(lexical.$createParagraphNode());
114
115
  }
115
- if (lexical.$getSelection() !== null) {
116
- root.getLastChild().select();
117
- }
118
116
  }, HISTORY_MERGE_OPTIONS);
119
117
  },
120
118
  editor
@@ -1 +1 @@
1
- {"version":3,"file":"lexicalEditor.js","sources":["../../../../../../src/components/basic/lexical-editor/composables/lexicalEditor.ts"],"sourcesContent":["\r\n\r\nimport { onMounted, provide, inject, reactive,onUnmounted } from 'vue'\r\nimport type { CreateEditorArgs, LexicalEditor, LexicalNode, NodeKey } from 'lexical'\r\nimport { $createParagraphNode, $getRoot, $getSelection, $isElementNode, $isParagraphNode, $isTextNode, BLUR_COMMAND, createEditor, ElementNode } from 'lexical'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport { useMounted } from './utils'\r\nimport { generateNodesFromHtml } from '../utils'\r\nimport { clearSelection, setSelected } from './useElementBlockSelection'\r\n\r\n\r\n/**\r\n * 编辑器模块\r\n */\r\nexport type LexicalEditorModule = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n options:Array<any>\r\n}\r\n\r\n/**\r\n * 编辑器模版类型\r\n */\r\nexport type LexicalEditorTemplate = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContextData = {\r\n importCss:string,\r\n importScript:string,\r\n importStyles:string,\r\n modules:Array<LexicalEditorModule>,\r\n templates:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 快捷工具条\r\n */\r\nexport type ShortcutToolsType = {\r\n exist:(node:LexicalNode)=>boolean,\r\n tools:(Array<{ key?:string, title:string,icon:string,action:(node:any,dom?:HTMLElement)=>unknown}> | ((nodeKey?:NodeKey | string)=>Array<any>|null))\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n */\r\nexport type LexicalEditorPlugin = {\r\n nodes?:Array<any>,\r\n tools?:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools?:(editor:LexicalEditor)=>Array<ShortcutToolsType>,\r\n useMounted:(editor:LexicalEditor)=>any,\r\n modules?:Array<LexicalEditorModule>,\r\n templates?:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContext = LexicalEditorContextData & {\r\n editor:LexicalEditor\r\n stageId:string,\r\n tools:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools:Array<ShortcutToolsType>\r\n}\r\n\r\n/**\r\n * 编辑器配置项\r\n */\r\nexport type LexicalEditorOptions = CreateEditorArgs & LexicalEditorContextData\r\n\r\n/**\r\n * 编辑器实例注入的key\r\n */\r\nconst LexicalEditorProviderKey = 'LexicalEditorProviderKey'\r\n\r\n/**\r\n * 历史合并选项\r\n */\r\nconst HISTORY_MERGE_OPTIONS = { tag: 'history-merge' }\r\n\r\n/**\r\n * 编辑器插件定义\r\n */\r\nconst EditorPlugins:Array<{namespace?:string,plugin:LexicalEditorPlugin}> = [];\r\n\r\n/**\r\n * 舞台全局数据\r\n */\r\nconst StageGlobalData = { num:0 }\r\n\r\n/**\r\n * 编辑器命名空间缓存\r\n */\r\nconst EditorNamespaceContextCache:any = {};\r\n\r\n \r\n/**\r\n * 注册编辑器插件\r\n * @param nodes \r\n */\r\nexport const registerEditorPlugin = function (plugin:LexicalEditorPlugin,namespace?:string) {\r\n EditorPlugins.push({namespace,plugin});\r\n}\r\n \r\n/**\r\n * \r\n * @param options 配置项 \r\n */\r\nexport const useLexicalEditor = function (options: LexicalEditorOptions, errHandle?: (error: Error) => void) {\r\n\r\n // 编号自增\r\n StageGlobalData.num++\r\n\r\n // 命名空间\r\n const namespace = options.namespace ?? `eidtor-${StageGlobalData.num}`;\r\n\r\n // 存在相同的空间则报错\r\n if(EditorNamespaceContextCache[namespace]){\r\n throw new Error(`编辑器命名空间【${namespace}】重复!`)\r\n }\r\n\r\n // 可以使用的插件列表\r\n const plugins = EditorPlugins.filter(p=>(!p.namespace || (p.namespace === namespace)))\r\n\r\n // 注册的节点\r\n const registerNodes:any = plugins.filter(p=>p.plugin.nodes).map(p=>p.plugin.nodes).reduce((a:any,b:any)=>a.concat(b))\r\n\r\n // 创建编辑器\r\n const editor = createEditor({\r\n editable: options.editable,\r\n html: options.html,\r\n namespace: namespace,\r\n nodes: options.nodes ? [...registerNodes, ...options.nodes] as any : registerNodes as any,\r\n theme: options.theme,\r\n onError: errHandle\r\n })\r\n\r\n // 挂载函数\r\n const mountHandles:any = plugins.filter(p=>p.plugin.useMounted).map(p=>p.plugin.useMounted)\r\n // 模版\r\n const templates:any = plugins.filter(p=>p.plugin.templates && p.plugin.templates.length).map(p=>p.plugin.templates).concat(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.template))\r\n // 模块\r\n const modules:any = plugins.filter(p=>p.plugin.modules && p.plugin.modules.length).map(p=>p.plugin.modules).concat(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.module))\r\n //快捷工具条\r\n const shortcutTools:Array<ShortcutToolsType> = []\r\n // 注入\r\n provide<LexicalEditorContext>(LexicalEditorProviderKey,EditorNamespaceContextCache[namespace] = {\r\n editor,stageId:`lexical-stage-${StageGlobalData.num}`,\r\n tools:plugins.map(p=>p.plugin.tools ?? []).reduce((a:any,b:any)=>a.concat(b)),\r\n shortcutTools,\r\n modules:options.modules.concat(modules),\r\n templates:options.templates.concat(templates),\r\n importCss:options.importCss,\r\n importScript:options.importScript,\r\n importStyles:options.importStyles \r\n })\r\n // \r\n shortcutTools.push(... plugins.map(p=>p.plugin.shortcutTools ? p.plugin.shortcutTools(editor):[]).reduce((a:any,b:any)=>a.concat(b)));\r\n\r\n useMounted(()=>{\r\n // 删除空容器\r\n return mergeRegister(\r\n // 焦点移除\r\n editor.registerCommand<FocusEvent>(BLUR_COMMAND,(event:FocusEvent) => {\r\n // 选中根\r\n setSelected(editor,true,$getRoot().__key)\r\n return false;\r\n }, 1),\r\n // 补空\r\n editor.registerUpdateListener(({ editorState }) => {\r\n \r\n editor.update(() => {\r\n const rootNode = $getRoot();\r\n // || !$isParagraphNode(rootNode.getLastChild())\r\n // 始终保持一个 p 存在\r\n if (rootNode.isEmpty()) { \r\n const p = $createParagraphNode()\r\n rootNode.append(p) \r\n // p.select();\r\n }\r\n\r\n //给所有空容器设置标识\r\n const list = [...rootNode.getChildren()];\r\n\r\n for(let i = 0; i<list.length;i++){\r\n\r\n const node = list[i];\r\n const el = editor.getElementByKey(node.getKey());\r\n\r\n if($isElementNode(node) && el){\r\n // 标识空容器\r\n if(node.isEmpty()){\r\n el.classList.add(\"mk-doc__empty-mark\");\r\n }\r\n else {\r\n el.classList.remove(\"mk-doc__empty-mark\");\r\n }\r\n \r\n list.push(...node.getChildren())\r\n }\r\n else if(el && $isTextNode(node)){\r\n // 标识br 前面的文本容器\r\n if(el?.nextElementSibling?.tagName.toLowerCase() == \"br\"){\r\n el.classList.add(\"mk-doc__br-brfore-mark\");\r\n }\r\n else{\r\n el.classList.remove(\"mk-doc__br-brfore-mark\");\r\n }\r\n }\r\n }\r\n })\r\n }),\r\n ...mountHandles.map((handle:any)=>handle(editor))\r\n ) \r\n })\r\n\r\n // 组件挂载之后\r\n onMounted(() => {\r\n\r\n // editor.blur(async ()=> await clearSelection(editor));\r\n\r\n editor.setEditable(options.editable !== undefined ? options.editable : true)\r\n\r\n // // 卸载组件之后 销毁编辑器实例\r\n onUnmounted(()=>{\r\n // 销毁这个命名空间的山修改文缓存\r\n delete EditorNamespaceContextCache[namespace];\r\n })\r\n })\r\n\r\n return { \r\n // 设置初始化内容\r\n setEditornitializeContent:(content?:string)=>{\r\n editor.update(() => {\r\n\r\n const root = $getRoot()\r\n\r\n root.clear();\r\n\r\n if(content){\r\n root.append(...generateNodesFromHtml(editor,content));\r\n }\r\n else{\r\n root.append($createParagraphNode())\r\n }\r\n\r\n // 设置选中 \r\n if ($getSelection() !== null) { (root.getLastChild() as ElementNode).select() } \r\n\r\n }, HISTORY_MERGE_OPTIONS)\r\n },\r\n editor \r\n }\r\n}\r\n\r\n/**\r\n * 获取当前编辑器上下文\r\n * @param namespace \r\n * @returns \r\n */\r\nexport const useLexicalEditorContext = function (namespace?:string) {\r\n\r\n const data = namespace ? EditorNamespaceContextCache[namespace] as LexicalEditorContext : inject<LexicalEditorContext>(LexicalEditorProviderKey);\r\n\r\n if(!data){ throw new Error(\"未获取到当前编辑器上下文!\"); }\r\n\r\n return {\r\n editor:data.editor,stageId:data.stageId,\r\n modules:data.modules ?? [],\r\n templates:data.templates ?? [],\r\n importCss:data.importCss ?? \"\",\r\n importScript:data.importScript ?? \"\",\r\n importStyles:data.importStyles ?? \"\",\r\n shortcutToolsList:data.shortcutTools,\r\n toolbarExtendPlugins :data.tools,\r\n // 查找模块\r\n findLexicalEditorModule(name:string):LexicalEditorModule|undefined{\r\n\r\n const module = data.modules.find(item=>item.name == name);\r\n \r\n if(module == null){\r\n console.warn(\"未知的模块:【\" + name + \"】\")\r\n }\r\n \r\n return module;\r\n },\r\n // 查找模版\r\n findLexicalEditorTemplate(name:string):LexicalEditorTemplate|undefined{\r\n\r\n const tempalte = data.templates.find(item=>item.name == name);\r\n \r\n if(tempalte == null){\r\n console.warn(\"未知的模版:【\" + name + \"】\")\r\n }\r\n \r\n return tempalte;\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模块定义\r\n */\r\nconst EditorModules:Array<{namespace?:string,module:LexicalEditorModule}> = [];\r\n\r\n/**\r\n * 注册模块\r\n * @param options \r\n */\r\nexport const registerLexicalEditorModule = (options:LexicalEditorModule,namespace?:string) => {\r\n\r\n if(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.module.name == options.name) >= 0){\r\n console.warn(`模块【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorModules.push({ namespace,module:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模块\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorModule = (name:string) => {\r\n\r\n for(let i = 0;i < EditorModules.length; i++){\r\n if(EditorModules[i].module.name == name){\r\n EditorModules.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模版定义\r\n */\r\nconst EditorTemplates:Array<{namespace?:string,template:LexicalEditorTemplate}> = [];\r\n\r\n/**\r\n * 注册模版\r\n * @param options \r\n */\r\nexport const registerLexicalEditorTemplate = (options:LexicalEditorTemplate,namespace?:string) => {\r\n\r\n if(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.template.name == options.name) >= 0){\r\n console.warn(`模版【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorTemplates.push({ namespace,template:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模版\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorTemplate = (name:string) => {\r\n\r\n for(let i = 0;i < EditorTemplates.length; i++){\r\n if(EditorTemplates[i].template.name == name){\r\n EditorTemplates.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// /**\r\n// * 初始化编辑器\r\n// * @param editor \r\n// * @param initialEditorState \r\n// * @returns \r\n// */\r\n// const initializeEditor = (editor: LexicalEditor, initialEditorState?: InitialEditorStateType): void => {\r\n\r\n// if (initialEditorState === null) { return }\r\n\r\n// if (initialEditorState === undefined) {\r\n \r\n// // 编辑内容为空的时候 默认创建一个 p\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) {\r\n\r\n// const paragraph = $createParagraphNode()\r\n\r\n// root.append(paragraph)\r\n\r\n// const activeElement = document.activeElement\r\n\r\n// if ($getSelection() !== null || (activeElement !== null && activeElement === editor.getRootElement())) {\r\n// paragraph.select()\r\n// }\r\n// }\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// }\r\n// else if (initialEditorState !== null) {\r\n\r\n// switch (typeof initialEditorState) {\r\n// case 'string': {\r\n// const parsedEditorState = editor.parseEditorState(initialEditorState)\r\n// editor.setEditorState(parsedEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'object': {\r\n// editor.setEditorState(initialEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'function': {\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) { initialEditorState(editor) }\r\n\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// }\r\n// }\r\n// }\r\n"],"names":["createEditor","provide","useMounted","mergeRegister","BLUR_COMMAND","setSelected","$getRoot","$createParagraphNode","$isElementNode","$isTextNode","onMounted","onUnmounted","generateNodesFromHtml","$getSelection","inject","module"],"mappings":"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"}
1
+ {"version":3,"file":"lexicalEditor.js","sources":["../../../../../../src/components/basic/lexical-editor/composables/lexicalEditor.ts"],"sourcesContent":["\r\n\r\nimport { onMounted, provide, inject, reactive,onUnmounted } from 'vue'\r\nimport type { CreateEditorArgs, LexicalEditor, LexicalNode, NodeKey } from 'lexical'\r\nimport { $createParagraphNode, $getRoot, $getSelection, $isElementNode, $isParagraphNode, $isTextNode, BLUR_COMMAND, createEditor, ElementNode } from 'lexical'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport { useMounted } from './utils'\r\nimport { generateNodesFromHtml } from '../utils'\r\nimport { clearSelection, setSelected } from './useElementBlockSelection'\r\n\r\n\r\n/**\r\n * 编辑器模块\r\n */\r\nexport type LexicalEditorModule = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n options:Array<any>\r\n}\r\n\r\n/**\r\n * 编辑器模版类型\r\n */\r\nexport type LexicalEditorTemplate = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContextData = {\r\n importCss:string,\r\n importScript:string,\r\n importStyles:string,\r\n modules:Array<LexicalEditorModule>,\r\n templates:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 快捷工具条\r\n */\r\nexport type ShortcutToolsType = {\r\n exist:(node:LexicalNode)=>boolean,\r\n tools:(Array<{ key?:string, title:string,icon:string,action:(node:any,dom?:HTMLElement)=>unknown}> | ((nodeKey?:NodeKey | string)=>Array<any>|null))\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n */\r\nexport type LexicalEditorPlugin = {\r\n nodes?:Array<any>,\r\n tools?:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools?:(editor:LexicalEditor)=>Array<ShortcutToolsType>,\r\n useMounted:(editor:LexicalEditor)=>any,\r\n modules?:Array<LexicalEditorModule>,\r\n templates?:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContext = LexicalEditorContextData & {\r\n editor:LexicalEditor\r\n stageId:string,\r\n tools:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools:Array<ShortcutToolsType>\r\n}\r\n\r\n/**\r\n * 编辑器配置项\r\n */\r\nexport type LexicalEditorOptions = CreateEditorArgs & LexicalEditorContextData\r\n\r\n/**\r\n * 编辑器实例注入的key\r\n */\r\nconst LexicalEditorProviderKey = 'LexicalEditorProviderKey'\r\n\r\n/**\r\n * 历史合并选项\r\n */\r\nconst HISTORY_MERGE_OPTIONS = { tag: 'history-merge' }\r\n\r\n/**\r\n * 编辑器插件定义\r\n */\r\nconst EditorPlugins:Array<{namespace?:string,plugin:LexicalEditorPlugin}> = [];\r\n\r\n/**\r\n * 舞台全局数据\r\n */\r\nconst StageGlobalData = { num:0 }\r\n\r\n/**\r\n * 编辑器命名空间缓存\r\n */\r\nconst EditorNamespaceContextCache:any = {};\r\n\r\n \r\n/**\r\n * 注册编辑器插件\r\n * @param nodes \r\n */\r\nexport const registerEditorPlugin = function (plugin:LexicalEditorPlugin,namespace?:string) {\r\n EditorPlugins.push({namespace,plugin});\r\n}\r\n \r\n/**\r\n * \r\n * @param options 配置项 \r\n */\r\nexport const useLexicalEditor = function (options: LexicalEditorOptions, errHandle?: (error: Error) => void) {\r\n\r\n // 编号自增\r\n StageGlobalData.num++\r\n\r\n // 命名空间\r\n const namespace = options.namespace ?? `eidtor-${StageGlobalData.num}`;\r\n\r\n // 存在相同的空间则报错\r\n if(EditorNamespaceContextCache[namespace]){\r\n throw new Error(`编辑器命名空间【${namespace}】重复!`)\r\n }\r\n\r\n // 可以使用的插件列表\r\n const plugins = EditorPlugins.filter(p=>(!p.namespace || (p.namespace === namespace)))\r\n\r\n // 注册的节点\r\n const registerNodes:any = plugins.filter(p=>p.plugin.nodes).map(p=>p.plugin.nodes).reduce((a:any,b:any)=>a.concat(b))\r\n\r\n // 创建编辑器\r\n const editor = createEditor({\r\n editable: options.editable,\r\n html: options.html,\r\n namespace: namespace,\r\n nodes: options.nodes ? [...registerNodes, ...options.nodes] as any : registerNodes as any,\r\n theme: options.theme,\r\n onError: errHandle\r\n })\r\n\r\n // 挂载函数\r\n const mountHandles:any = plugins.filter(p=>p.plugin.useMounted).map(p=>p.plugin.useMounted)\r\n // 模版\r\n const templates:any = plugins.filter(p=>p.plugin.templates && p.plugin.templates.length).map(p=>p.plugin.templates).concat(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.template))\r\n // 模块\r\n const modules:any = plugins.filter(p=>p.plugin.modules && p.plugin.modules.length).map(p=>p.plugin.modules).concat(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.module))\r\n //快捷工具条\r\n const shortcutTools:Array<ShortcutToolsType> = []\r\n // 注入\r\n provide<LexicalEditorContext>(LexicalEditorProviderKey,EditorNamespaceContextCache[namespace] = {\r\n editor,stageId:`lexical-stage-${StageGlobalData.num}`,\r\n tools:plugins.map(p=>p.plugin.tools ?? []).reduce((a:any,b:any)=>a.concat(b)),\r\n shortcutTools,\r\n modules:options.modules.concat(modules),\r\n templates:options.templates.concat(templates),\r\n importCss:options.importCss,\r\n importScript:options.importScript,\r\n importStyles:options.importStyles \r\n })\r\n // \r\n shortcutTools.push(... plugins.map(p=>p.plugin.shortcutTools ? p.plugin.shortcutTools(editor):[]).reduce((a:any,b:any)=>a.concat(b)));\r\n\r\n useMounted(()=>{\r\n // 删除空容器\r\n return mergeRegister(\r\n // // 焦点移除\r\n // editor.registerCommand<FocusEvent>(BLUR_COMMAND,(event:FocusEvent) => {\r\n // // 选中根\r\n // // setSelected(editor,true,$getRoot().__key)\r\n // return false;\r\n // }, 1),\r\n // 补空\r\n editor.registerUpdateListener(({ editorState }) => {\r\n \r\n editor.update(() => {\r\n const rootNode = $getRoot();\r\n // || !$isParagraphNode(rootNode.getLastChild())\r\n // 始终保持一个 p 存在\r\n if (rootNode.isEmpty()) { \r\n const p = $createParagraphNode()\r\n rootNode.append(p) \r\n }\r\n\r\n //给所有空容器设置标识\r\n const list = [...rootNode.getChildren()];\r\n\r\n for(let i = 0; i<list.length;i++){\r\n\r\n const node = list[i];\r\n const el = editor.getElementByKey(node.getKey());\r\n\r\n if($isElementNode(node) && el){\r\n // 标识空容器\r\n if(node.isEmpty()){\r\n el.classList.add(\"mk-doc__empty-mark\");\r\n }\r\n else {\r\n el.classList.remove(\"mk-doc__empty-mark\");\r\n }\r\n \r\n list.push(...node.getChildren())\r\n }\r\n else if(el && $isTextNode(node)){\r\n // 标识br 前面的文本容器\r\n if(el?.nextElementSibling?.tagName.toLowerCase() == \"br\"){\r\n el.classList.add(\"mk-doc__br-brfore-mark\");\r\n }\r\n else{\r\n el.classList.remove(\"mk-doc__br-brfore-mark\");\r\n }\r\n }\r\n }\r\n })\r\n }),\r\n ...mountHandles.map((handle:any)=>handle(editor))\r\n ) \r\n })\r\n\r\n // 组件挂载之后\r\n onMounted(() => {\r\n\r\n // editor.blur(async ()=> await clearSelection(editor));\r\n\r\n editor.setEditable(options.editable !== undefined ? options.editable : true)\r\n\r\n // // 卸载组件之后 销毁编辑器实例\r\n onUnmounted(()=>{\r\n // 销毁这个命名空间的山修改文缓存\r\n delete EditorNamespaceContextCache[namespace];\r\n })\r\n })\r\n\r\n return { \r\n // 设置初始化内容\r\n setEditornitializeContent:(content?:string)=>{\r\n editor.update(() => {\r\n\r\n const root = $getRoot()\r\n\r\n root.clear();\r\n\r\n if(content){\r\n root.append(...generateNodesFromHtml(editor,content));\r\n }\r\n else{\r\n root.append($createParagraphNode())\r\n }\r\n\r\n // // 设置选中 \r\n // if ($getSelection() == null) { \r\n // setSelected(editor,true,root.getLastChild()?.getKey() ?? \"\")\r\n // } \r\n\r\n }, HISTORY_MERGE_OPTIONS)\r\n },\r\n editor \r\n }\r\n}\r\n\r\n/**\r\n * 获取当前编辑器上下文\r\n * @param namespace \r\n * @returns \r\n */\r\nexport const useLexicalEditorContext = function (namespace?:string) {\r\n\r\n const data = namespace ? EditorNamespaceContextCache[namespace] as LexicalEditorContext : inject<LexicalEditorContext>(LexicalEditorProviderKey);\r\n\r\n if(!data){ throw new Error(\"未获取到当前编辑器上下文!\"); }\r\n\r\n return {\r\n editor:data.editor,stageId:data.stageId,\r\n modules:data.modules ?? [],\r\n templates:data.templates ?? [],\r\n importCss:data.importCss ?? \"\",\r\n importScript:data.importScript ?? \"\",\r\n importStyles:data.importStyles ?? \"\",\r\n shortcutToolsList:data.shortcutTools,\r\n toolbarExtendPlugins :data.tools,\r\n // 查找模块\r\n findLexicalEditorModule(name:string):LexicalEditorModule|undefined{\r\n\r\n const module = data.modules.find(item=>item.name == name);\r\n \r\n if(module == null){\r\n console.warn(\"未知的模块:【\" + name + \"】\")\r\n }\r\n \r\n return module;\r\n },\r\n // 查找模版\r\n findLexicalEditorTemplate(name:string):LexicalEditorTemplate|undefined{\r\n\r\n const tempalte = data.templates.find(item=>item.name == name);\r\n \r\n if(tempalte == null){\r\n console.warn(\"未知的模版:【\" + name + \"】\")\r\n }\r\n \r\n return tempalte;\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模块定义\r\n */\r\nconst EditorModules:Array<{namespace?:string,module:LexicalEditorModule}> = [];\r\n\r\n/**\r\n * 注册模块\r\n * @param options \r\n */\r\nexport const registerLexicalEditorModule = (options:LexicalEditorModule,namespace?:string) => {\r\n\r\n if(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.module.name == options.name) >= 0){\r\n console.warn(`模块【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorModules.push({ namespace,module:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模块\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorModule = (name:string) => {\r\n\r\n for(let i = 0;i < EditorModules.length; i++){\r\n if(EditorModules[i].module.name == name){\r\n EditorModules.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模版定义\r\n */\r\nconst EditorTemplates:Array<{namespace?:string,template:LexicalEditorTemplate}> = [];\r\n\r\n/**\r\n * 注册模版\r\n * @param options \r\n */\r\nexport const registerLexicalEditorTemplate = (options:LexicalEditorTemplate,namespace?:string) => {\r\n\r\n if(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.template.name == options.name) >= 0){\r\n console.warn(`模版【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorTemplates.push({ namespace,template:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模版\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorTemplate = (name:string) => {\r\n\r\n for(let i = 0;i < EditorTemplates.length; i++){\r\n if(EditorTemplates[i].template.name == name){\r\n EditorTemplates.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// /**\r\n// * 初始化编辑器\r\n// * @param editor \r\n// * @param initialEditorState \r\n// * @returns \r\n// */\r\n// const initializeEditor = (editor: LexicalEditor, initialEditorState?: InitialEditorStateType): void => {\r\n\r\n// if (initialEditorState === null) { return }\r\n\r\n// if (initialEditorState === undefined) {\r\n \r\n// // 编辑内容为空的时候 默认创建一个 p\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) {\r\n\r\n// const paragraph = $createParagraphNode()\r\n\r\n// root.append(paragraph)\r\n\r\n// const activeElement = document.activeElement\r\n\r\n// if ($getSelection() !== null || (activeElement !== null && activeElement === editor.getRootElement())) {\r\n// paragraph.select()\r\n// }\r\n// }\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// }\r\n// else if (initialEditorState !== null) {\r\n\r\n// switch (typeof initialEditorState) {\r\n// case 'string': {\r\n// const parsedEditorState = editor.parseEditorState(initialEditorState)\r\n// editor.setEditorState(parsedEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'object': {\r\n// editor.setEditorState(initialEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'function': {\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) { initialEditorState(editor) }\r\n\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// }\r\n// }\r\n// }\r\n"],"names":["createEditor","provide","useMounted","mergeRegister","$getRoot","$createParagraphNode","$isElementNode","$isTextNode","onMounted","onUnmounted","generateNodesFromHtml","inject","module"],"mappings":"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"}
@@ -118,6 +118,12 @@ class ImageNode extends HtmlElementDecoratorNode.HtmlElementDecoratorNode {
118
118
  }
119
119
  return false;
120
120
  }
121
+ /**
122
+ * @returns
123
+ */
124
+ isInline() {
125
+ return true;
126
+ }
121
127
  }
122
128
  function $createImageNode(src, alt, className, style) {
123
129
  return new ImageNode(src, alt, className, style);
@@ -1 +1 @@
1
- {"version":3,"file":"ImageNode.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/ImageNode.ts"],"sourcesContent":["\r\nimport type {\r\n DOMConversionMap,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n SerializedLexicalNode,\r\n LexicalEditor\r\n} from 'lexical'\r\nimport { Component } from 'vue';\r\nimport { HtmlElementDecoratorNode,SerializedHtmlElementDecoratorNode } from \"./HtmlElementDecoratorNode\"\r\nimport { type LexicalCommand, createCommand } from 'lexical'\r\n\r\n/**\r\n * 插入图片指令\r\n */\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<{src:string,alt?:string,style?:string}> = createCommand('INSERT_IMAGE_COMMAND')\r\n\r\n// 默认图片\r\nconst ImageDefaultSrc = \"data:image/png;base64,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\";\r\n\r\n/**\r\n * 图片节点序列化\r\n */\r\nexport type SerializedImageNode = Spread<{ src: string,alt?:string }, SerializedHtmlElementDecoratorNode>\r\n\r\n/** \r\n * 定义图片节点\r\n */\r\nexport class ImageNode extends HtmlElementDecoratorNode {\r\n __src: string\r\n __alt?:string\r\n\r\n static getType(): string { return 'image' }\r\n\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(node.__src, node.__alt,node.__class,node.__style,node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n return $createImageNode(serializedNode.src,serializedNode.alt,serializedNode.class,serializedNode.style)\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: (el: HTMLElement) => {\r\n const src = el.getAttribute('src');\r\n const alt = el.getAttribute('alt');\r\n return el.tagName.toLowerCase() == \"img\" ? {\r\n conversion: (domNode: HTMLElement) => {\r\n return { \r\n node:$createImageNode(src ?? \"\",alt ?? undefined,domNode.className,domNode.getAttribute(\"style\") ?? \"\") \r\n };\r\n },\r\n priority: 1\r\n } : null\r\n },\r\n }\r\n }\r\n\r\n constructor(src: string,alt?:string,className?:string,style?:string, key?: NodeKey) {\r\n super(\"img\",className,style,key)\r\n this.__src = src\r\n this.__alt = alt\r\n }\r\n\r\n /**\r\n * 隔离渲染函数\r\n * @param editor \r\n * @param config \r\n * @returns \r\n */\r\n decorate(editor: LexicalEditor, config: EditorConfig): Component | null {\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 导出JSON\r\n * @returns \r\n */\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: this.getType(),\r\n version: 1,\r\n src: this.__src,\r\n alt: this.__alt\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 设置src\r\n * @param src \r\n * @returns \r\n */\r\n setSrc(src:string) {\r\n const self = this.getWritable();\r\n self.__src = src || \"\";\r\n return this;\r\n }\r\n\r\n /**\r\n * 设置 alt\r\n * @param alt \r\n * @returns \r\n */\r\n setAlt(alt:string) {\r\n const self = this.getWritable();\r\n self.__alt= alt || \"\";\r\n return this;\r\n }\r\n /**\r\n * 创建DOM\r\n * @param config \r\n * @returns \r\n */\r\n createDOM(config: EditorConfig): HTMLElement {\r\n\r\n const element = super.createDOM(config);\r\n\r\n if(this.__src){\r\n element.setAttribute('src', this.__src) \r\n }\r\n else{\r\n element.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n element.setAttribute('alt', this.__alt)\r\n }\r\n\r\n return element\r\n }\r\n\r\n /**\r\n * 更新DOM\r\n * @param _prevNode \r\n * @param _dom \r\n * @param _config \r\n * @returns \r\n */\r\n updateDOM(prevNode: LexicalNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n super.updateDOM(prevNode,dom,config);\r\n if(this.__src){\r\n dom.setAttribute('src', this.__src) \r\n }\r\n else{\r\n dom.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n dom.setAttribute('alt', this.__alt)\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * 创建图片节点\r\n * @param src \r\n * @returns \r\n */\r\nexport function $createImageNode(src: string,alt?:string,className?:string,style?:string): ImageNode {\r\n return new ImageNode(src,alt,className,style)\r\n}\r\n\r\n/**\r\n * 判断是否是图片节点\r\n * @param node \r\n * @returns \r\n */\r\nexport function $isImageNode(\r\n node: ImageNode | LexicalNode | null | undefined,\r\n): node is ImageNode {\r\n return node instanceof ImageNode\r\n}\r\n"],"names":["createCommand","HtmlElementDecoratorNode"],"mappings":";;;;;;;AAkBa,MAAA,uBAA+EA,sBAAc,sBAAsB;AAGhI,MAAM,kBAAkB;AAUjB,MAAM,kBAAkBC,yBAAAA,yBAAyB;AAAA,EAgCtD,YAAY,KAAY,KAAY,WAAkB,OAAe,KAAe;AAC5E,UAAA,OAAM,WAAU,OAAM,GAAG;AAhCjC;AACA;AAgCE,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAhCA,OAAO,UAAkB;AAAS,WAAA;AAAA,EAAQ;AAAA,EAG1C,OAAO,MAAM,MAA4B;AAChC,WAAA,IAAI,UAAU,KAAK,OAAQ,KAAK,OAAM,KAAK,SAAQ,KAAK,SAAQ,KAAK,KAAK;AAAA,EACnF;AAAA,EAEA,OAAO,WAAW,gBAAgD;AACzD,WAAA,iBAAiB,eAAe,KAAI,eAAe,KAAI,eAAe,OAAM,eAAe,KAAK;AAAA,EACzG;AAAA,EAEA,OAAO,YAAqC;AACnC,WAAA;AAAA,MACL,KAAK,CAAC,OAAoB;AAClB,cAAA,MAAM,GAAG,aAAa,KAAK;AAC3B,cAAA,MAAM,GAAG,aAAa,KAAK;AACjC,eAAO,GAAG,QAAQ,YAAY,KAAK,QAAU;AAAA,UAC3C,YAAY,CAAC,YAAyB;AAC7B,mBAAA;AAAA,cACL,MAAK,iBAAiB,OAAO,IAAG,OAAO,QAAU,QAAQ,WAAU,QAAQ,aAAa,OAAO,KAAK,EAAE;AAAA,YAAA;AAAA,UAE1G;AAAA,UACA,UAAU;AAAA,QACR,IAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS,QAAuB,QAAwC;AAE/D,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAkC;AACzB,WAAA;AAAA,MACL,GAAG,MAAM,WAAW;AAAA,MACpB,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS;AAAA,MACT,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,IAAA;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAY;AACX,UAAA,OAAO,KAAK;AAClB,SAAK,QAAQ,OAAO;AACb,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAY;AACX,UAAA,OAAO,KAAK;AAClB,SAAK,QAAO,OAAO;AACZ,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAmC;AAErC,UAAA,UAAU,MAAM,UAAU,MAAM;AAEtC,QAAG,KAAK,OAAM;AACJ,cAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IAAA,OAEpC;AACM,cAAA,aAAa,OAAO,eAAe;AAAA,IAC7C;AAEA,QAAG,KAAK,OAAM;AACJ,cAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IACxC;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,UAAuB,KAAkB,QAA+B;AAC1E,UAAA,UAAU,UAAS,KAAI,MAAM;AACnC,QAAG,KAAK,OAAM;AACR,UAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IAAA,OAEhC;AACE,UAAA,aAAa,OAAO,eAAe;AAAA,IACzC;AAEA,QAAG,KAAK,OAAM;AACR,UAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IACpC;AACO,WAAA;AAAA,EACT;AACF;AAQO,SAAS,iBAAiB,KAAY,KAAY,WAAkB,OAA0B;AACnG,SAAO,IAAI,UAAU,KAAI,KAAI,WAAU,KAAK;AAC9C;AAOO,SAAS,aACd,MACmB;AACnB,SAAO,gBAAgB;AACzB;;;;;"}
1
+ {"version":3,"file":"ImageNode.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/ImageNode.ts"],"sourcesContent":["\r\nimport type {\r\n DOMConversionMap,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n SerializedLexicalNode,\r\n LexicalEditor\r\n} from 'lexical'\r\nimport { Component } from 'vue';\r\nimport { HtmlElementDecoratorNode,SerializedHtmlElementDecoratorNode } from \"./HtmlElementDecoratorNode\"\r\nimport { type LexicalCommand, createCommand } from 'lexical'\r\n\r\n/**\r\n * 插入图片指令\r\n */\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<{src:string,alt?:string,style?:string}> = createCommand('INSERT_IMAGE_COMMAND')\r\n\r\n// 默认图片\r\nconst ImageDefaultSrc = \"data:image/png;base64,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\";\r\n\r\n/**\r\n * 图片节点序列化\r\n */\r\nexport type SerializedImageNode = Spread<{ src: string,alt?:string }, SerializedHtmlElementDecoratorNode>\r\n\r\n/** \r\n * 定义图片节点\r\n */\r\nexport class ImageNode extends HtmlElementDecoratorNode {\r\n __src: string\r\n __alt?:string\r\n\r\n static getType(): string { return 'image' }\r\n\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(node.__src, node.__alt,node.__class,node.__style,node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n return $createImageNode(serializedNode.src,serializedNode.alt,serializedNode.class,serializedNode.style)\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: (el: HTMLElement) => {\r\n const src = el.getAttribute('src');\r\n const alt = el.getAttribute('alt');\r\n return el.tagName.toLowerCase() == \"img\" ? {\r\n conversion: (domNode: HTMLElement) => {\r\n return { \r\n node:$createImageNode(src ?? \"\",alt ?? undefined,domNode.className,domNode.getAttribute(\"style\") ?? \"\") \r\n };\r\n },\r\n priority: 1\r\n } : null\r\n },\r\n }\r\n }\r\n\r\n constructor(src: string,alt?:string,className?:string,style?:string, key?: NodeKey) {\r\n super(\"img\",className,style,key)\r\n this.__src = src\r\n this.__alt = alt\r\n }\r\n\r\n /**\r\n * 隔离渲染函数\r\n * @param editor \r\n * @param config \r\n * @returns \r\n */\r\n decorate(editor: LexicalEditor, config: EditorConfig): Component | null {\r\n return null;\r\n }\r\n\r\n /**\r\n * 导出JSON\r\n * @returns \r\n */\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: this.getType(),\r\n version: 1,\r\n src: this.__src,\r\n alt: this.__alt\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 设置src\r\n * @param src \r\n * @returns \r\n */\r\n setSrc(src:string) {\r\n const self = this.getWritable();\r\n self.__src = src || \"\";\r\n return this;\r\n }\r\n\r\n /**\r\n * 设置 alt\r\n * @param alt \r\n * @returns \r\n */\r\n setAlt(alt:string) {\r\n const self = this.getWritable();\r\n self.__alt= alt || \"\";\r\n return this;\r\n }\r\n /**\r\n * 创建DOM\r\n * @param config \r\n * @returns \r\n */\r\n createDOM(config: EditorConfig): HTMLElement {\r\n\r\n const element = super.createDOM(config);\r\n\r\n if(this.__src){\r\n element.setAttribute('src', this.__src) \r\n }\r\n else{\r\n element.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n element.setAttribute('alt', this.__alt)\r\n }\r\n\r\n return element\r\n }\r\n\r\n /**\r\n * 更新DOM\r\n * @param _prevNode \r\n * @param _dom \r\n * @param _config \r\n * @returns \r\n */\r\n updateDOM(prevNode: ImageNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n super.updateDOM(prevNode,dom,config);\r\n if(this.__src){\r\n dom.setAttribute('src', this.__src) \r\n }\r\n else{\r\n dom.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n dom.setAttribute('alt', this.__alt)\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @returns \r\n */\r\n isInline() { return true; }\r\n}\r\n\r\n\r\n/**\r\n * 创建图片节点\r\n * @param src \r\n * @returns \r\n */\r\nexport function $createImageNode(src: string,alt?:string,className?:string,style?:string): ImageNode {\r\n return new ImageNode(src,alt,className,style)\r\n}\r\n\r\n/**\r\n * 判断是否是图片节点\r\n * @param node \r\n * @returns \r\n */\r\nexport function $isImageNode(\r\n node: ImageNode | LexicalNode | null | undefined,\r\n): node is ImageNode {\r\n return node instanceof ImageNode\r\n}\r\n"],"names":["createCommand","HtmlElementDecoratorNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Template.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/Template.ts"],"sourcesContent":["\r\n\r\nimport { type LexicalCommand, createCommand} from 'lexical'\r\n\r\n/**\r\n * 插入模版块指令\r\n */\r\nexport const INSERT_TEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_TEMPLATE_COMMAND')\r\n\r\n/**\r\n * 插入HTML模版块指令 \r\n */\r\nexport const INSERT_HTMLTEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_HTMLTEMPLATE_COMMAND')\r\n"],"names":["createCommand"],"mappings":";;;AAOa,MAAA,0BAAkDA,sBAAc,yBAAyB;AAKzF,MAAA,8BAAsDA,sBAAc,6BAA6B;;;"}
1
+ {"version":3,"file":"Template.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/Template.ts"],"sourcesContent":["\r\n\r\nimport { type LexicalCommand, createCommand} from 'lexical'\r\n\r\n/**\r\n * 插入模版块指令\r\n */\r\nexport const INSERT_TEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_TEMPLATE_COMMAND')\r\n\r\n/**\r\n * 插入HTML模版块指令 \r\n */\r\nexport const INSERT_HTMLTEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_HTMLTEMPLATE_COMMAND')\r\n"],"names":["createCommand"],"mappings":";;;AAOa,MAAA,0BAAkDA,sBAAc,yBAAyB;AAKzF,MAAA,8BAAsDA,sBAAc,6BAA6B;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AutoFocusPlugin.vue.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/AutoFocusPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { nextTick, onMounted } from 'vue'\r\nimport { useLexicalEditorContext } from '../composables'\r\n\r\nconst props = defineProps<{\r\n defaultSelection?: 'rootStart' | 'rootEnd'\r\n}>()\r\n\r\nconst { editor } = useLexicalEditorContext();\r\n\r\nonMounted(() => {\r\n\r\n nextTick(() => {\r\n editor.focus(\r\n () => {\r\n // If we try and move selection to the same point with setBaseAndExtent, it won't\r\n // trigger a re-focus on the element. So in the case this occurs, we'll need to correct it.\r\n // Normally this is fine, Selection API !== Focus API, but fore the intents of the naming\r\n // of this plugin, which should preserve focus too.\r\n const activeElement = document.activeElement\r\n const rootElement = editor.getRootElement() as HTMLDivElement\r\n if (\r\n rootElement !== null\r\n && (activeElement === null || !rootElement.contains(activeElement))\r\n ) {\r\n // Note: preventScroll won't work in Webkit.\r\n rootElement.focus({ preventScroll: true })\r\n }\r\n },\r\n { defaultSelection: props.defaultSelection },\r\n )\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":["useLexicalEditorContext","onMounted","nextTick"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAIR,UAAA,EAAE,WAAWA,cAAAA;AAEnBC,QAAAA,UAAU,MAAM;AAEdC,UAAAA,SAAS,MAAM;AACN,eAAA;AAAA,UACL,MAAM;AAKJ,kBAAM,gBAAgB,SAAS;AACzB,kBAAA,cAAc,OAAO;AAEzB,gBAAA,gBAAgB,SACZ,kBAAkB,QAAQ,CAAC,YAAY,SAAS,aAAa,IACjE;AAEA,0BAAY,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,QAAA;AAAA,MAC7C,CACD;AAAA,IAAA,CACF;;;;;;;"}
1
+ {"version":3,"file":"AutoFocusPlugin.vue.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/AutoFocusPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { nextTick, onMounted } from 'vue'\r\nimport { useLexicalEditorContext } from '../composables'\r\n\r\nconst props = defineProps<{\r\n defaultSelection?: 'rootStart' | 'rootEnd'\r\n}>()\r\n\r\nconst { editor } = useLexicalEditorContext();\r\n\r\nonMounted(() => {\r\n\r\n nextTick(() => {\r\n editor.focus(() => {\r\n // If we try and move selection to the same point with setBaseAndExtent, it won't\r\n // trigger a re-focus on the element. So in the case this occurs, we'll need to correct it.\r\n // Normally this is fine, Selection API !== Focus API, but fore the intents of the naming\r\n // of this plugin, which should preserve focus too.\r\n const activeElement = document.activeElement\r\n const rootElement = editor.getRootElement() as HTMLDivElement\r\n if (\r\n rootElement !== null\r\n && (activeElement === null || !rootElement.contains(activeElement))\r\n ) {\r\n // Note: preventScroll won't work in Webkit.\r\n rootElement.focus({ preventScroll: true })\r\n }\r\n },\r\n { defaultSelection: props.defaultSelection },\r\n )\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":["useLexicalEditorContext","onMounted","nextTick"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAIR,UAAA,EAAE,WAAWA,cAAAA;AAEnBC,QAAAA,UAAU,MAAM;AAEdC,UAAAA,SAAS,MAAM;AACN,eAAA;AAAA,UAAM,MAAM;AAKf,kBAAM,gBAAgB,SAAS;AACzB,kBAAA,cAAc,OAAO;AAEzB,gBAAA,gBAAgB,SACZ,kBAAkB,QAAQ,CAAC,YAAY,SAAS,aAAa,IACjE;AAEA,0BAAY,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,QAAA;AAAA,MAC7C,CACD;AAAA,IAAA,CACF;;;;;;;"}
@@ -2,6 +2,6 @@
2
2
  const NodeTreeViewPlugin_vue_vue_type_script_setup_true_lang = require("./NodeTreeViewPlugin.vue3.js");
3
3
  ;/* empty css */
4
4
  const _pluginVue_exportHelper = require("../../../../_virtual/_plugin-vue_export-helper.js");
5
- const NodeTreeViewPlugin = /* @__PURE__ */ _pluginVue_exportHelper(NodeTreeViewPlugin_vue_vue_type_script_setup_true_lang, [["__scopeId", "data-v-873c3ba2"]]);
5
+ const NodeTreeViewPlugin = /* @__PURE__ */ _pluginVue_exportHelper(NodeTreeViewPlugin_vue_vue_type_script_setup_true_lang, [["__scopeId", "data-v-315b8c39"]]);
6
6
  module.exports = NodeTreeViewPlugin;
7
7
  //# sourceMappingURL=NodeTreeViewPlugin.vue.js.map
@@ -32,7 +32,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
32
32
  key: node.getKey(),
33
33
  name: name.toUpperCase(),
34
34
  desc: node.getDesc ? node.getDesc() : void 0,
35
- disabled: lexical.$isTextNode(node)
35
+ disabled: lexical.$isTextNode(node) || lexical.$isParagraphNode(node) && node.getChildrenSize() <= 0
36
36
  });
37
37
  if (node.getParent()) {
38
38
  list = list.concat(createNodeTree(node.getParent()));
@@ -1 +1 @@
1
- {"version":3,"file":"NodeTreeViewPlugin.vue3.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport {\r\n $getSelection,$isRangeSelection,$isNodeSelection, NodeKey,$isParagraphNode,\r\n$isRootNode,\r\n$isTextNode\r\n} from 'lexical'\r\nimport { $isHeadingNode } from '@lexical/rich-text'\r\nimport { useLexicalEditorContext, useMounted,setElementBlockSelection } from '../composables'\r\nimport { ref } from 'vue'\r\nimport { ArrowRightBold } from \"@element-plus/icons-vue\"\r\n\r\nconst { editor } = useLexicalEditorContext()\r\n\r\nconst selectNodeTreeList = ref<Array<{ key:string|NodeKey,name:string,desc?:string,disabled:boolean }>>([{name:\"ROOT\",key:\"root\",disabled:true}]);\r\n\r\nconst createNodeTree = (node?:any)=>{\r\n\r\n let list:any = [];\r\n\r\n if(node){\r\n\r\n let name:string = $isParagraphNode(node) ? \"P\" : (node.getName ? node.getName() : node.getType());\r\n\r\n // 标题\r\n if($isHeadingNode(node)){ name = `${node.getTag()}` }\r\n\r\n list.push({ \r\n key:node.getKey(),\r\n name:name.toUpperCase(),\r\n desc:node.getDesc ? node.getDesc() : undefined,\r\n disabled:$isTextNode(node)\r\n })\r\n\r\n if(node.getParent()){\r\n list = list.concat(createNodeTree(node.getParent()))\r\n }\r\n }\r\n\r\n return list;\r\n}\r\n\r\nuseMounted(() => {\r\n\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n\r\n editorState.read(()=>{\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n selectNodeTreeList.value = createNodeTree(selection.anchor.getNode()).reverse();\r\n }\r\n else if($isNodeSelection(selection)){\r\n selectNodeTreeList.value = createNodeTree(selection.getNodes()[0]).reverse();\r\n }\r\n })\r\n \r\n })\r\n})\r\n\r\n \r\n</script>\r\n\r\n<template>\r\n <div class=\"lexical-editor-node-tree\">\r\n <template v-for=\"item in selectNodeTreeList\" :key=\"item.key\">\r\n <div class=\"item\">\r\n <el-tooltip effect=\"dark\" :content=\"item.desc\" :disabled=\"!item.desc\" placement=\"top\">\r\n <el-button class=\"text\" text :nodeKey=\"item.key\" :disabled=\"item.disabled\" @click=\"setElementBlockSelection(editor,item.key)\">\r\n {{item.name}}\r\n <el-icon class=\"el-icon--right\"><ArrowRightBold /></el-icon>\r\n </el-button>\r\n </el-tooltip>\r\n </div>\r\n </template>\r\n </div>\r\n</template>\r\n<style lang=\"scss\" scoped>\r\n.lexical-editor-node-tree{\r\n display: flex;\r\n align-items: center;\r\n min-height: 30px;\r\n >.item{\r\n display: flex;\r\n align-items: center;\r\n font-size: 14px;\r\n .text{\r\n padding: 5px 5px 5px 7px;\r\n display: flex;\r\n align-items: center;\r\n }\r\n &:last-child .el-icon--right{\r\n display: none;\r\n }\r\n }\r\n}\r\n</style>\r\n"],"names":["useLexicalEditorContext","ref","$isParagraphNode","$isHeadingNode","$isTextNode","useMounted","$getSelection","$isRangeSelection","$isNodeSelection"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYM,UAAA,EAAE,WAAWA,cAAAA;AAEb,UAAA,qBAAqBC,IAAAA,IAA6E,CAAC,EAAC,MAAK,QAAO,KAAI,QAAO,UAAS,KAAI,CAAC,CAAC;AAE1I,UAAA,iBAAiB,CAAC,SAAY;AAEhC,UAAI,OAAW,CAAA;AAEf,UAAG,MAAK;AAEA,YAAA,OAAcC,QAAAA,iBAAiB,IAAI,IAAI,MAAO,KAAK,UAAU,KAAK,QAAA,IAAY,KAAK,QAAQ;AAG5F,YAAAC,SAAAA,eAAe,IAAI,GAAE;AAAS,iBAAA,GAAG,KAAK,OAAA,CAAQ;AAAA,QAAG;AAEpD,aAAK,KAAK;AAAA,UACN,KAAI,KAAK,OAAO;AAAA,UAChB,MAAK,KAAK,YAAY;AAAA,UACtB,MAAK,KAAK,UAAU,KAAK,YAAY;AAAA,UACrC,UAASC,oBAAY,IAAI;AAAA,QAAA,CAC5B;AAEE,YAAA,KAAK,aAAY;AAChB,iBAAO,KAAK,OAAO,eAAe,KAAK,UAAW,CAAA,CAAC;AAAA,QACvD;AAAA,MACJ;AAEO,aAAA;AAAA,IAAA;AAGXC,UAAAA,WAAW,MAAM;AAEb,aAAO,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AAEtD,oBAAY,KAAK,MAAI;AAEjB,gBAAM,YAAYC,QAAAA;AAEd,cAAAC,QAAAA,kBAAkB,SAAS,GAAG;AAC9B,+BAAmB,QAAQ,eAAe,UAAU,OAAO,QAAS,CAAA,EAAE;UAAQ,WAE1EC,QAAAA,iBAAiB,SAAS,GAAE;AACb,+BAAA,QAAQ,eAAe,UAAU,SAAA,EAAW,CAAC,CAAC,EAAE;UACvE;AAAA,QAAA,CACH;AAAA,MAAA,CAEJ;AAAA,IAAA,CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"NodeTreeViewPlugin.vue3.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport {\r\n $getSelection,$isRangeSelection,$isNodeSelection, NodeKey,$isParagraphNode,\r\n $isRootNode,$isTextNode\r\n} from 'lexical'\r\nimport { $isHeadingNode } from '@lexical/rich-text'\r\nimport { useLexicalEditorContext, useMounted,setElementBlockSelection } from '../composables'\r\nimport { ref } from 'vue'\r\nimport { ArrowRightBold } from \"@element-plus/icons-vue\"\r\n\r\nconst { editor } = useLexicalEditorContext()\r\n\r\nconst selectNodeTreeList = ref<Array<{ key:string|NodeKey,name:string,desc?:string,disabled:boolean }>>([{name:\"ROOT\",key:\"root\",disabled:true}]);\r\n\r\nconst createNodeTree = (node?:any)=>{\r\n\r\n let list:any = [];\r\n\r\n if(node){\r\n\r\n let name:string = $isParagraphNode(node) ? \"P\" : (node.getName ? node.getName() : node.getType());\r\n\r\n // 标题\r\n if($isHeadingNode(node)){ name = `${node.getTag()}` }\r\n\r\n list.push({ \r\n key:node.getKey(),\r\n name:name.toUpperCase(),\r\n desc:node.getDesc ? node.getDesc() : undefined,\r\n disabled:$isTextNode(node) || ($isParagraphNode(node) && node.getChildrenSize() <= 0)\r\n })\r\n\r\n if(node.getParent()){\r\n list = list.concat(createNodeTree(node.getParent()))\r\n }\r\n }\r\n\r\n return list;\r\n}\r\n\r\nuseMounted(() => {\r\n\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n\r\n editorState.read(()=>{\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n selectNodeTreeList.value = createNodeTree(selection.anchor.getNode()).reverse();\r\n }\r\n else if($isNodeSelection(selection)){\r\n selectNodeTreeList.value = createNodeTree(selection.getNodes()[0]).reverse();\r\n }\r\n })\r\n \r\n })\r\n})\r\n\r\n \r\n</script>\r\n\r\n<template>\r\n <div class=\"lexical-editor-node-tree\">\r\n <template v-for=\"item in selectNodeTreeList\" :key=\"item.key\">\r\n <div class=\"item\">\r\n <el-tooltip effect=\"dark\" :content=\"item.desc\" :disabled=\"!item.desc\" placement=\"top\">\r\n <el-button class=\"text\" text :nodeKey=\"item.key\" :disabled=\"item.disabled\" @click=\"setElementBlockSelection(editor,item.key)\">\r\n {{item.name}}\r\n <el-icon class=\"el-icon--right\"><ArrowRightBold /></el-icon>\r\n </el-button>\r\n </el-tooltip>\r\n </div>\r\n </template>\r\n </div>\r\n</template>\r\n<style lang=\"scss\" scoped>\r\n.lexical-editor-node-tree{\r\n display: flex;\r\n align-items: center;\r\n min-height: 30px;\r\n >.item{\r\n display: flex;\r\n align-items: center;\r\n font-size: 14px;\r\n .text{\r\n padding: 5px 5px 5px 7px;\r\n display: flex;\r\n align-items: center;\r\n }\r\n &:last-child .el-icon--right{\r\n display: none;\r\n }\r\n }\r\n}\r\n</style>\r\n"],"names":["useLexicalEditorContext","ref","$isParagraphNode","$isHeadingNode","$isTextNode","useMounted","$getSelection","$isRangeSelection","$isNodeSelection"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAWM,UAAA,EAAE,WAAWA,cAAAA;AAEb,UAAA,qBAAqBC,IAAAA,IAA6E,CAAC,EAAC,MAAK,QAAO,KAAI,QAAO,UAAS,KAAI,CAAC,CAAC;AAE1I,UAAA,iBAAiB,CAAC,SAAY;AAEhC,UAAI,OAAW,CAAA;AAEf,UAAG,MAAK;AAEA,YAAA,OAAcC,QAAAA,iBAAiB,IAAI,IAAI,MAAO,KAAK,UAAU,KAAK,QAAA,IAAY,KAAK,QAAQ;AAG5F,YAAAC,SAAAA,eAAe,IAAI,GAAE;AAAS,iBAAA,GAAG,KAAK,OAAA,CAAQ;AAAA,QAAG;AAEpD,aAAK,KAAK;AAAA,UACN,KAAI,KAAK,OAAO;AAAA,UAChB,MAAK,KAAK,YAAY;AAAA,UACtB,MAAK,KAAK,UAAU,KAAK,YAAY;AAAA,UACrC,UAASC,QAAAA,YAAY,IAAI,KAAMF,QAAAA,iBAAiB,IAAI,KAAK,KAAK,gBAAA,KAAqB;AAAA,QAAA,CACtF;AAEE,YAAA,KAAK,aAAY;AAChB,iBAAO,KAAK,OAAO,eAAe,KAAK,UAAW,CAAA,CAAC;AAAA,QACvD;AAAA,MACJ;AAEO,aAAA;AAAA,IAAA;AAGXG,UAAAA,WAAW,MAAM;AAEb,aAAO,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AAEtD,oBAAY,KAAK,MAAI;AAEjB,gBAAM,YAAYC,QAAAA;AAEd,cAAAC,QAAAA,kBAAkB,SAAS,GAAG;AAC9B,+BAAmB,QAAQ,eAAe,UAAU,OAAO,QAAS,CAAA,EAAE;UAAQ,WAE1EC,QAAAA,iBAAiB,SAAS,GAAE;AACb,+BAAA,QAAQ,eAAe,UAAU,SAAA,EAAW,CAAC,CAAC,EAAE;UACvE;AAAA,QAAA,CACH;AAAA,MAAA,CAEJ;AAAA,IAAA,CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -60,20 +60,22 @@ const insertNodeHandle = (node, selectNode) => {
60
60
  moduleWarp.append(node);
61
61
  node = moduleWarp;
62
62
  }
63
- if (lexical.$isRootNode(selectNode) && ImageNode.$isImageNode(node)) {
63
+ if (ImageNode.$isImageNode(node)) {
64
64
  const p = lexical.$createParagraphNode();
65
65
  p.append(node);
66
66
  node = p;
67
67
  }
68
68
  if (lexical.$isElementNode(selectNode) && !lexical.$isParagraphNode(selectNode)) {
69
69
  selectNode.append(node);
70
+ } else if (lexical.$isParagraphNode(selectNode)) {
71
+ selectNode.replace(node);
70
72
  } else {
71
73
  utils$1.$insertNodeToNearestRoot(node);
72
74
  }
73
75
  };
74
76
  const insertNodesHandle = (...nodes) => {
75
77
  const selection = lexical.$getSelection();
76
- let selectNode = lexical.$isNodeSelection(selection) ? selection == null ? void 0 : selection.getNodes()[0] : lexical.$getRoot();
78
+ let selectNode = lexical.$isNodeSelection(selection) ? selection == null ? void 0 : selection.getNodes()[0] : lexical.$isRangeSelection(selection) ? selection.anchor.getNode() : lexical.$getRoot();
77
79
  nodes.forEach((node) => insertNodeHandle(node, selectNode));
78
80
  return false;
79
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditorPlugin.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/RichTextEditorPlugin.ts"],"sourcesContent":["\r\n\r\nimport { $createParagraphNode, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isNodeSelection, $isParagraphNode, $isRootNode, COMMAND_PRIORITY_LOW, LexicalNode, NodeKey } from \"lexical\";\r\n\r\nimport { DRAG_DROP_PASTE, HeadingNode, QuoteNode } from '@lexical/rich-text'\r\nimport { CodeHighlightNode, CodeNode } from '@lexical/code'\r\nimport { $isLinkNode, $toggleLink, AutoLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link'\r\nimport { registerEditorPlugin, useLexicalEditorContext } from \"../composables\"\r\nimport { \r\n HtmlElementDecoratorNode,getModuleData,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode,\r\n $isImageNode,\r\n $isImageTextWarpNode,\r\n INSERT_IMAGETEXTWARP_COMMAND,\r\n $createImageTextWarpNode,\r\n INSERT_IMAGE_COMMAND,\r\n $createImageNode,\r\n INSERT_MODULE_COMMAND,\r\n ModulePropType,\r\n createModuleHtml,\r\n $isModuleDecoratorNode,\r\n $isModuleDecoratorWarpNode,\r\n INSERT_TEMPLATE_COMMAND,\r\n INSERT_HTMLTEMPLATE_COMMAND\r\n } from \"../nodes\"\r\nimport { $insertNodeToNearestRoot, isMimeType, mediaFileReader, mergeRegister } from \"@lexical/utils\";\r\nimport { generateNodesFromHtml, getCSSFromStyleObject, imageUpload, sanitizeUrl, showHtmlTemplateDialog, showImageEditDialog, showLinkEditDialog, showModuleSelectDialog, showTemplateSelectDialog } from \"../utils\";\r\nimport { ElLoading } from \"element-plus\";\r\nimport { createDefaultFormData, showDynamicFormDialoger } from \"../../dynamic-form-panel\"; \r\n\r\n// 上传处理函数\r\nconst uploadhandle = async (pathList: Array<string>) => {\r\n\r\n if (pathList.length) {\r\n\r\n const loadingInstance = ElLoading.service({ fullscreen: true, text: \"图片上传中...\" })\r\n\r\n const reesult = await Promise.all(pathList.map(path => imageUpload(path)))\r\n\r\n loadingInstance.close();\r\n\r\n return reesult;\r\n }\r\n\r\n return [];\r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodeHandle = (node: LexicalNode,selectNode:LexicalNode) => {\r\n\r\n // 模块\r\n if ($isModuleDecoratorNode(node) && !$isModuleDecoratorWarpNode(node)) {\r\n const moduleWarp = new ModuleDecoratorWarpNode();\r\n moduleWarp.append(node);\r\n node = moduleWarp;\r\n }\r\n\r\n // 图片\r\n if($isRootNode(selectNode) && $isImageNode(node)){\r\n const p = $createParagraphNode();\r\n p.append(node)\r\n node = p;\r\n }\r\n\r\n if ($isElementNode(selectNode) && !$isParagraphNode(selectNode)) {\r\n\r\n selectNode.append(node);\r\n } \r\n else{\r\n \r\n $insertNodeToNearestRoot(node);\r\n }\r\n \r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodesHandle = (...nodes: Array<LexicalNode>) => {\r\n\r\n const selection = $getSelection()\r\n let selectNode = $isNodeSelection(selection) ? selection?.getNodes()[0] : $getRoot();\r\n\r\n nodes.forEach(node=> insertNodeHandle(node,selectNode))\r\n\r\n return false;\r\n}\r\n\r\n// 注册插件\r\nregisterEditorPlugin({\r\n nodes:[\r\n AutoLinkNode, LinkNode,\r\n CodeHighlightNode, CodeNode ,\r\n HeadingNode, QuoteNode ,\r\n HtmlElementDecoratorNode,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode\r\n ],\r\n tools:[\r\n {\r\n icon: \"Picture\",\r\n text: \"图片\",\r\n action:(editor)=>{\r\n // 显示图片编辑面板\r\n showImageEditDialog({\r\n src: \"\", alt: \"\", width: \"\", height: \"\", maxWidth: \"100%\", maxHeight: \"\", margin: \"\"\r\n }).then(async (data: any) => {\r\n const result = await uploadhandle([data.src])\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { \r\n src:result[0] as string,\r\n alt:data.alt,\r\n style:getCSSFromStyleObject({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\"margin\":data.margin\r\n }) \r\n })\r\n });\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"Grid\",\r\n text: \"模块\",\r\n action:async (editor)=>{\r\n // 打开模块面板\r\n const result = (await showModuleSelectDialog(editor._config.namespace)) as any;\r\n const defaultData = createDefaultFormData(result.options);\r\n editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"richtext\",\r\n text:\"模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_TEMPLATE_COMMAND,await showTemplateSelectDialog(editor._config.namespace))\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"richtext-outline\",\r\n text: \"图文环绕\",\r\n action:(editor)=>{\r\n editor.dispatchCommand(INSERT_IMAGETEXTWARP_COMMAND,null)\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"html-code\",\r\n text:\"HTML模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_HTMLTEMPLATE_COMMAND,await showHtmlTemplateDialog())\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:89\r\n }\r\n ],\r\n shortcutTools:editor=>{\r\n\r\n const { findLexicalEditorModule } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n return [\r\n // 默认编辑\r\n // {\r\n // exist:(node)=>$isHtmlElementNode(node) || $isHtmlElementDecoratorNode(node),\r\n // tools:[\r\n // {\r\n // key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LexicalNode) => {\r\n // console.log(\"编辑\")\r\n // // // 打开模块面板\r\n // // const result = (await showModuleSelectDialog()) as ModuleType;\r\n // // const defaultData = createDefaultFormData(result.options);\r\n // // // 插入模块\r\n // // editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n // }\r\n // }\r\n // ]\r\n // },\r\n // 超链接\r\n {\r\n exist:(node)=>$isLinkNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LinkNode) => {\r\n \r\n // 显示图片编辑面板\r\n showLinkEditDialog(editor.read(()=>editNode.getURL())).then((href:any)=>{\r\n if(href.trim()){\r\n editor.update(()=>{\r\n editNode.getWritable().setURL(sanitizeUrl(href))\r\n })\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n })\r\n \r\n }\r\n }\r\n ]\r\n },\r\n // 模块\r\n {\r\n exist:(node)=>$isModuleDecoratorNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ModuleDecoratorNode) => {\r\n const module = findLexicalEditorModule(editNode.__moduleName);\r\n if(module){\r\n const result = await showDynamicFormDialoger(module.title,module.options,getModuleData(editNode.__moduleHtml,module.options))\r\n editor.update(() => editNode.setHtml(createModuleHtml(module.template,result)))\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n // 图片编辑\r\n {\r\n exist:(node)=>$isImageNode(node),\r\n tools:(nodeKey) => {\r\n \r\n const node = $getNodeByKey(nodeKey as NodeKey);\r\n \r\n if ($isImageNode(node)) {\r\n \r\n const parent = node.getParent();\r\n \r\n // 是否是文本环绕里面的图\r\n const isImageTextWarp = $isImageTextWarpNode(parent)\r\n \r\n // 工具条\r\n const toolbarList:Array<any> = [\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ImageNode) => {\r\n \r\n const {src,alt,style} = { style:editNode.getStyleObj(),src:editNode.__src,alt:editNode.__alt }\r\n \r\n const data: any = await showImageEditDialog({\r\n src, alt, \r\n width: style.width || \"\", height: style.height || \"\", \r\n maxWidth: style[\"max-width\"] || \"\", maxHeight: style[\"max-height\"] || \"\",\r\n margin: style.margin || \"\"\r\n }) \r\n \r\n const result = await uploadhandle([data.src])\r\n \r\n editor.update(()=>{\r\n\r\n node.setSrc(result[0] as string)\r\n node.setAlt(data.alt)\r\n node.addStyle({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\r\n \"margin\":data.margin\r\n })\r\n })\r\n }\r\n }\r\n ];\r\n \r\n // 左对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居左\" : \"左对齐\",icon:`doc-align-left`,action:async (editNode:ImageNode)=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n editNode.addStyle({ 'float':\"left\" })\r\n }\r\n else {\r\n parent.setFormat(\"left\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n // 居中对齐\r\n if($isParagraphNode(parent) && !isImageTextWarp){\r\n toolbarList.push({ title: \"居中对齐\",icon:`doc-align-center`,action:async ()=>{\r\n editor.update(()=>parent.setFormat(\"center\") )\r\n }\r\n });\r\n }\r\n \r\n // 右对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居右\" : \"右对齐\",icon:`doc-align-right`,action:async ()=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n node.addStyle({ 'float':\"right\" })\r\n }\r\n else {\r\n parent.setFormat(\"right\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n return toolbarList;\r\n }\r\n \r\n return null;\r\n }\r\n }\r\n ]\r\n },\r\n templates:[],\r\n useMounted(editor){\r\n \r\n const { findLexicalEditorModule,findLexicalEditorTemplate } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n \r\n // 注册指令\r\n return mergeRegister(\r\n // // 插入布局格子\r\n // editor.registerCommand<LayoutGridNodeAttrType>(INSERT_LAYOUTGRID_COMMAND, (payload) => {\r\n\r\n // insertGridHandle(new LayoutGridNode(payload));\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入文本格子\r\n // editor.registerCommand<TextGridNodeAttrType>(INSERT_TEXTGRID_COMMAND, (payload) => {\r\n\r\n // const textGrid = new TextGridNode(payload)\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // insertGridHandle(textGrid);\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入模块格子\r\n // editor.registerCommand<ModuleGridNodeAttrType>(INSERT_MODULEGRID_COMMAND, (payload) => {\r\n // insertGridHandle(new ModuleGridNode(payload));\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // 插入模块\r\n editor.registerCommand<ModulePropType>(INSERT_MODULE_COMMAND,(payload) => {\r\n\r\n const module = findLexicalEditorModule(payload.name)\r\n\r\n if(module){\r\n insertNodesHandle(new ModuleDecoratorNode(payload.name,createModuleHtml(module.template,payload.data)))\r\n }\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n // 插入图文环绕\r\n editor.registerCommand<null>(INSERT_IMAGETEXTWARP_COMMAND, () => insertNodesHandle($createImageTextWarpNode()), COMMAND_PRIORITY_LOW),\r\n // 插入图片\r\n editor.registerCommand(INSERT_IMAGE_COMMAND, (payload) => {\r\n return insertNodesHandle($createImageNode(payload.src,payload.alt,\"\",payload.style))\r\n }, COMMAND_PRIORITY_LOW),\r\n // 剪切板图片\r\n editor.registerCommand(DRAG_DROP_PASTE, (files) => {\r\n const types = [\r\n 'image/',\r\n 'image/heic',\r\n 'image/heif',\r\n 'image/gif',\r\n 'image/webp',\r\n ];\r\n\r\n (async () => {\r\n\r\n const filesResult = await mediaFileReader(files, [types].flatMap((x) => x))\r\n\r\n const result = await uploadhandle(filesResult.filter(f => isMimeType(f.file, types)).map(f => f.result))\r\n\r\n result.forEach((path) => {\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { src: path as string, alt: \"\", style:\"max-width:100%\"})\r\n })\r\n })()\r\n\r\n return true\r\n }, COMMAND_PRIORITY_LOW),\r\n // 插入模版\r\n editor.registerCommand<string>(INSERT_TEMPLATE_COMMAND,(name) => {\r\n\r\n const template = findLexicalEditorTemplate(name);\r\n \r\n const templateNodes = template ? generateNodesFromHtml(editor, template.template) : [];\r\n \r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n \r\n // 插入HTML模版\r\n editor.registerCommand<string>(INSERT_HTMLTEMPLATE_COMMAND,(html) => {\r\n\r\n const templateNodes = generateNodesFromHtml(editor, html);\r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n //链接\r\n editor.registerCommand(TOGGLE_LINK_COMMAND,(payload) => {\r\n if (payload === null) {\r\n $toggleLink(payload)\r\n return true\r\n }\r\n else if (typeof payload === 'string') {\r\n $toggleLink(payload)\r\n return false\r\n }\r\n else {\r\n const { url, target, rel, title } = payload\r\n $toggleLink(url, { rel, target, title })\r\n return true\r\n }\r\n }, COMMAND_PRIORITY_LOW)\r\n );\r\n }\r\n})\r\n"],"names":["ElLoading","imageUpload","$isModuleDecoratorNode","$isModuleDecoratorWarpNode","ModuleDecoratorWarpNode","$isRootNode","$isImageNode","$createParagraphNode","$isElementNode","$isParagraphNode","$insertNodeToNearestRoot","$getSelection","$isNodeSelection","$getRoot","registerEditorPlugin","AutoLinkNode","LinkNode","CodeHighlightNode","CodeNode","HeadingNode","QuoteNode","HtmlElementDecoratorNode","ModuleDecoratorNode","HtmlElementNode","ImageNode","ImageTextWarpNode","showImageEditDialog","INSERT_IMAGE_COMMAND","getCSSFromStyleObject","showModuleSelectDialog","createDefaultFormData","INSERT_MODULE_COMMAND","INSERT_TEMPLATE_COMMAND","showTemplateSelectDialog","INSERT_IMAGETEXTWARP_COMMAND","INSERT_HTMLTEMPLATE_COMMAND","showHtmlTemplateDialog","useLexicalEditorContext","$isLinkNode","showLinkEditDialog","sanitizeUrl","TOGGLE_LINK_COMMAND","showDynamicFormDialoger","getModuleData","createModuleHtml","$getNodeByKey","$isImageTextWarpNode","mergeRegister","COMMAND_PRIORITY_LOW","$createImageTextWarpNode","$createImageNode","DRAG_DROP_PASTE","mediaFileReader","isMimeType","template","generateNodesFromHtml","html","$toggleLink","url"],"mappings":"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"}
1
+ {"version":3,"file":"RichTextEditorPlugin.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/RichTextEditorPlugin.ts"],"sourcesContent":["\r\n\r\nimport { $createParagraphNode, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isNodeSelection, $isParagraphNode, $isRangeSelection, $isRootNode, COMMAND_PRIORITY_LOW, LexicalNode, NodeKey } from \"lexical\";\r\n\r\nimport { DRAG_DROP_PASTE, HeadingNode, QuoteNode } from '@lexical/rich-text'\r\nimport { CodeHighlightNode, CodeNode } from '@lexical/code'\r\nimport { $isLinkNode, $toggleLink, AutoLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link'\r\nimport { registerEditorPlugin, useLexicalEditorContext } from \"../composables\"\r\nimport { \r\n HtmlElementDecoratorNode,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode,\r\n $isImageNode,\r\n $isImageTextWarpNode,\r\n INSERT_IMAGETEXTWARP_COMMAND,\r\n $createImageTextWarpNode,\r\n INSERT_IMAGE_COMMAND,\r\n $createImageNode,\r\n INSERT_MODULE_COMMAND,\r\n ModulePropType,\r\n createModuleHtml,getModuleData,\r\n $isModuleDecoratorNode,\r\n $isModuleDecoratorWarpNode,\r\n INSERT_HTMLTEMPLATE_COMMAND,\r\n INSERT_TEMPLATE_COMMAND\r\n } from \"../nodes\"\r\nimport { $insertNodeToNearestRoot, isMimeType, mediaFileReader, mergeRegister } from \"@lexical/utils\";\r\nimport { generateNodesFromHtml, getCSSFromStyleObject, imageUpload, sanitizeUrl, showHtmlTemplateDialog, showImageEditDialog, showLinkEditDialog, showModuleSelectDialog, showTemplateSelectDialog } from \"../utils\";\r\nimport { ElLoading } from \"element-plus\";\r\nimport { createDefaultFormData, showDynamicFormDialoger } from \"../../dynamic-form-panel\"; \r\n\r\n// 上传处理函数\r\nconst uploadhandle = async (pathList: Array<string>) => {\r\n\r\n if (pathList.length) {\r\n\r\n const loadingInstance = ElLoading.service({ fullscreen: true, text: \"图片上传中...\" })\r\n\r\n const reesult = await Promise.all(pathList.map(path => imageUpload(path)))\r\n\r\n loadingInstance.close();\r\n\r\n return reesult;\r\n }\r\n\r\n return [];\r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodeHandle = (node: LexicalNode,selectNode:LexicalNode) => {\r\n\r\n // 模块\r\n if ($isModuleDecoratorNode(node) && !$isModuleDecoratorWarpNode(node)) {\r\n const moduleWarp = new ModuleDecoratorWarpNode();\r\n moduleWarp.append(node);\r\n node = moduleWarp;\r\n }\r\n\r\n // 图片\r\n if($isImageNode(node)){\r\n const p = $createParagraphNode();\r\n p.append(node)\r\n node = p;\r\n }\r\n if ($isElementNode(selectNode) && !$isParagraphNode(selectNode)) {\r\n selectNode.append(node);\r\n } \r\n else if ($isParagraphNode(selectNode)) {\r\n selectNode.replace(node);\r\n } \r\n else{\r\n $insertNodeToNearestRoot(node);\r\n }\r\n \r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodesHandle = (...nodes: Array<LexicalNode>) => {\r\n\r\n const selection = $getSelection()\r\n let selectNode = $isNodeSelection(selection) ? selection?.getNodes()[0] : ($isRangeSelection(selection) ? selection.anchor.getNode() : $getRoot());\r\n\r\n nodes.forEach(node=> insertNodeHandle(node,selectNode))\r\n\r\n return false;\r\n}\r\n\r\n// 注册插件\r\nregisterEditorPlugin({\r\n nodes:[\r\n AutoLinkNode, LinkNode,\r\n CodeHighlightNode, CodeNode ,\r\n HeadingNode, QuoteNode ,\r\n HtmlElementDecoratorNode,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode\r\n ],\r\n tools:[\r\n {\r\n icon: \"Picture\",\r\n text: \"图片\",\r\n action:(editor)=>{\r\n // 显示图片编辑面板\r\n showImageEditDialog({\r\n src: \"\", alt: \"\", width: \"\", height: \"\", maxWidth: \"100%\", maxHeight: \"\", margin: \"\"\r\n }).then(async (data: any) => {\r\n const result = await uploadhandle([data.src])\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { \r\n src:result[0] as string,\r\n alt:data.alt,\r\n style:getCSSFromStyleObject({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\"margin\":data.margin\r\n }) \r\n })\r\n });\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"Grid\",\r\n text: \"模块\",\r\n action:async (editor)=>{\r\n // 打开模块面板\r\n const result = (await showModuleSelectDialog(editor._config.namespace)) as any;\r\n const defaultData = createDefaultFormData(result.options);\r\n editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"richtext\",\r\n text:\"模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_TEMPLATE_COMMAND,await showTemplateSelectDialog(editor._config.namespace))\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"richtext-outline\",\r\n text: \"图文环绕\",\r\n action:(editor)=>{\r\n editor.dispatchCommand(INSERT_IMAGETEXTWARP_COMMAND,null)\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"html-code\",\r\n text:\"HTML模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_HTMLTEMPLATE_COMMAND,await showHtmlTemplateDialog())\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:89\r\n }\r\n ],\r\n shortcutTools:editor=>{\r\n\r\n const { findLexicalEditorModule } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n return [\r\n // 默认编辑\r\n // {\r\n // exist:(node)=>$isHtmlElementNode(node) || $isHtmlElementDecoratorNode(node),\r\n // tools:[\r\n // {\r\n // key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LexicalNode) => {\r\n // console.log(\"编辑\")\r\n // // // 打开模块面板\r\n // // const result = (await showModuleSelectDialog()) as ModuleType;\r\n // // const defaultData = createDefaultFormData(result.options);\r\n // // // 插入模块\r\n // // editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n // }\r\n // }\r\n // ]\r\n // },\r\n // 超链接\r\n {\r\n exist:(node)=>$isLinkNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LinkNode) => {\r\n \r\n // 显示图片编辑面板\r\n showLinkEditDialog(editor.read(()=>editNode.getURL())).then((href:any)=>{\r\n if(href.trim()){\r\n editor.update(()=>{\r\n editNode.getWritable().setURL(sanitizeUrl(href))\r\n })\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n })\r\n \r\n }\r\n }\r\n ]\r\n },\r\n // 模块\r\n {\r\n exist:(node)=>$isModuleDecoratorNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ModuleDecoratorNode) => {\r\n const module = findLexicalEditorModule(editNode.__moduleName);\r\n if(module){\r\n const result = await showDynamicFormDialoger(module.title,module.options,getModuleData(editNode.__moduleHtml,module.options))\r\n editor.update(() => editNode.setHtml(createModuleHtml(module.template,result)))\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n // 图片编辑\r\n {\r\n exist:(node)=>$isImageNode(node),\r\n tools:(nodeKey) => {\r\n \r\n const node = $getNodeByKey(nodeKey as NodeKey);\r\n \r\n if ($isImageNode(node)) {\r\n \r\n const parent = node.getParent();\r\n \r\n // 是否是文本环绕里面的图\r\n const isImageTextWarp = $isImageTextWarpNode(parent)\r\n \r\n // 工具条\r\n const toolbarList:Array<any> = [\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ImageNode) => {\r\n \r\n const {src,alt,style} = { style:editNode.getStyleObj(),src:editNode.__src,alt:editNode.__alt }\r\n \r\n const data: any = await showImageEditDialog({\r\n src, alt, \r\n width: style.width || \"\", height: style.height || \"\", \r\n maxWidth: style[\"max-width\"] || \"\", maxHeight: style[\"max-height\"] || \"\",\r\n margin: style.margin || \"\"\r\n }) \r\n \r\n const result = await uploadhandle([data.src])\r\n \r\n editor.update(()=>{\r\n\r\n node.setSrc(result[0] as string)\r\n node.setAlt(data.alt)\r\n node.addStyle({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\r\n \"margin\":data.margin\r\n })\r\n })\r\n }\r\n }\r\n ];\r\n \r\n // 左对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居左\" : \"左对齐\",icon:`doc-align-left`,action:async (editNode:ImageNode)=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n editNode.addStyle({ 'float':\"left\" })\r\n }\r\n else {\r\n parent.setFormat(\"left\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n // 居中对齐\r\n if($isParagraphNode(parent) && !isImageTextWarp){\r\n toolbarList.push({ title: \"居中对齐\",icon:`doc-align-center`,action:async ()=>{\r\n editor.update(()=>parent.setFormat(\"center\") )\r\n }\r\n });\r\n }\r\n \r\n // 右对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居右\" : \"右对齐\",icon:`doc-align-right`,action:async ()=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n node.addStyle({ 'float':\"right\" })\r\n }\r\n else {\r\n parent.setFormat(\"right\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n return toolbarList;\r\n }\r\n \r\n return null;\r\n }\r\n }\r\n ]\r\n },\r\n templates:[],\r\n useMounted(editor){\r\n \r\n const { findLexicalEditorModule,findLexicalEditorTemplate } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n \r\n // 注册指令\r\n return mergeRegister(\r\n // // 插入布局格子\r\n // editor.registerCommand<LayoutGridNodeAttrType>(INSERT_LAYOUTGRID_COMMAND, (payload) => {\r\n\r\n // insertGridHandle(new LayoutGridNode(payload));\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入文本格子\r\n // editor.registerCommand<TextGridNodeAttrType>(INSERT_TEXTGRID_COMMAND, (payload) => {\r\n\r\n // const textGrid = new TextGridNode(payload)\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // insertGridHandle(textGrid);\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入模块格子\r\n // editor.registerCommand<ModuleGridNodeAttrType>(INSERT_MODULEGRID_COMMAND, (payload) => {\r\n // insertGridHandle(new ModuleGridNode(payload));\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // 插入模块\r\n editor.registerCommand<ModulePropType>(INSERT_MODULE_COMMAND,(payload) => {\r\n\r\n const module = findLexicalEditorModule(payload.name)\r\n\r\n if(module){\r\n insertNodesHandle(new ModuleDecoratorNode(payload.name,createModuleHtml(module.template,payload.data)))\r\n }\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n // 插入图文环绕\r\n editor.registerCommand<null>(INSERT_IMAGETEXTWARP_COMMAND, () => insertNodesHandle($createImageTextWarpNode()), COMMAND_PRIORITY_LOW),\r\n // 插入图片\r\n editor.registerCommand(INSERT_IMAGE_COMMAND, (payload) => {\r\n return insertNodesHandle($createImageNode(payload.src,payload.alt,\"\",payload.style))\r\n }, COMMAND_PRIORITY_LOW),\r\n // 剪切板图片\r\n editor.registerCommand(DRAG_DROP_PASTE, (files) => {\r\n const types = [\r\n 'image/',\r\n 'image/heic',\r\n 'image/heif',\r\n 'image/gif',\r\n 'image/webp',\r\n ];\r\n\r\n (async () => {\r\n\r\n const filesResult = await mediaFileReader(files, [types].flatMap((x) => x))\r\n\r\n const result = await uploadhandle(filesResult.filter(f => isMimeType(f.file, types)).map(f => f.result))\r\n\r\n result.forEach((path) => {\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { src: path as string, alt: \"\", style:\"max-width:100%\"})\r\n })\r\n })()\r\n\r\n return true\r\n }, COMMAND_PRIORITY_LOW),\r\n // 插入模版\r\n editor.registerCommand<string>(INSERT_TEMPLATE_COMMAND,(name) => {\r\n\r\n const template = findLexicalEditorTemplate(name);\r\n \r\n const templateNodes = template ? generateNodesFromHtml(editor, template.template) : [];\r\n \r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n \r\n // 插入HTML模版\r\n editor.registerCommand<string>(INSERT_HTMLTEMPLATE_COMMAND,(html) => {\r\n\r\n const templateNodes = generateNodesFromHtml(editor, html);\r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n //链接\r\n editor.registerCommand(TOGGLE_LINK_COMMAND,(payload) => {\r\n if (payload === null) {\r\n $toggleLink(payload)\r\n return true\r\n }\r\n else if (typeof payload === 'string') {\r\n $toggleLink(payload)\r\n return false\r\n }\r\n else {\r\n const { url, target, rel, title } = payload\r\n $toggleLink(url, { rel, target, title })\r\n return true\r\n }\r\n }, COMMAND_PRIORITY_LOW)\r\n );\r\n }\r\n})\r\n"],"names":["ElLoading","imageUpload","$isModuleDecoratorNode","$isModuleDecoratorWarpNode","ModuleDecoratorWarpNode","$isImageNode","$createParagraphNode","$isElementNode","$isParagraphNode","$insertNodeToNearestRoot","$getSelection","$isNodeSelection","$isRangeSelection","$getRoot","registerEditorPlugin","AutoLinkNode","LinkNode","CodeHighlightNode","CodeNode","HeadingNode","QuoteNode","HtmlElementDecoratorNode","ModuleDecoratorNode","HtmlElementNode","ImageNode","ImageTextWarpNode","showImageEditDialog","INSERT_IMAGE_COMMAND","getCSSFromStyleObject","$isRootNode","showModuleSelectDialog","createDefaultFormData","INSERT_MODULE_COMMAND","INSERT_TEMPLATE_COMMAND","showTemplateSelectDialog","INSERT_IMAGETEXTWARP_COMMAND","INSERT_HTMLTEMPLATE_COMMAND","showHtmlTemplateDialog","useLexicalEditorContext","$isLinkNode","showLinkEditDialog","sanitizeUrl","TOGGLE_LINK_COMMAND","showDynamicFormDialoger","getModuleData","createModuleHtml","$getNodeByKey","$isImageTextWarpNode","mergeRegister","COMMAND_PRIORITY_LOW","$createImageTextWarpNode","$createImageNode","DRAG_DROP_PASTE","mediaFileReader","isMimeType","template","generateNodesFromHtml","html","$toggleLink","url"],"mappings":"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"}
@@ -1,19 +1,19 @@
1
- .lexical-editor-node-tree[data-v-873c3ba2] {
1
+ .lexical-editor-node-tree[data-v-315b8c39] {
2
2
  display: flex;
3
3
  align-items: center;
4
4
  min-height: 30px;
5
5
  }
6
- .lexical-editor-node-tree > .item[data-v-873c3ba2] {
6
+ .lexical-editor-node-tree > .item[data-v-315b8c39] {
7
7
  display: flex;
8
8
  align-items: center;
9
9
  font-size: 14px;
10
10
  }
11
- .lexical-editor-node-tree > .item .text[data-v-873c3ba2] {
11
+ .lexical-editor-node-tree > .item .text[data-v-315b8c39] {
12
12
  padding: 5px 5px 5px 7px;
13
13
  display: flex;
14
14
  align-items: center;
15
15
  }
16
- .lexical-editor-node-tree > .item:last-child .el-icon--right[data-v-873c3ba2] {
16
+ .lexical-editor-node-tree > .item:last-child .el-icon--right[data-v-315b8c39] {
17
17
  display: none;
18
18
  }.mk-doc-editor-shortcut-tools-warp[data-v-6efcbbca] {
19
19
  position: absolute;
@@ -1,4 +1,4 @@
1
- const DocEditorCss = ' \r\n.mk-doc__embedBlock {\r\n position: relative;\r\n z-index: 1;\r\n padding: 1px;\r\n cursor: pointer;\r\n}\r\n\r\n.mk-doc__embedBlock >*{ pointer-events: none; }\r\n\r\n/* 清除浮动 */\r\n.mk-doc-editor-stage::after{\r\n content: "";\r\n display: block;\r\n clear: both;\r\n width: 0;\r\n height: 0;\r\n font-size: 0;\r\n}\r\n/* 缩进 */\r\n.mk-doc-editor-stage * {\r\n --lexical-indent-base-value:2em\r\n}\r\n/* 光标样式 */\r\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\r\n.mk-doc__empty-mark::before,\r\n.mk-doc__br-brfore-mark::after{ \r\n content: "↩︎";\r\n color: #ccc;\r\n margin-left: 4px;\r\n cursor: text;\r\n user-select: none;\r\n pointer-events: none;\r\n position: absolute;\r\n font-size: 12px;\r\n height: 0;\r\n width: 1px; \r\n vertical-align: middle;\r\n}\r\n\r\n/* placeholder 模式 */\r\n.mk-doc-editor-stage.placeholder *::after,\r\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\r\n\r\n/* 选中样式 */\r\n.mk-doc__node-selection {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n/* hover 的标识线条 */\r\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\r\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\r\n outline: 1px solid #d7e6ff;\r\n}\r\n.mk-doc__image-text-warp p:hover,\r\n.mk-doc__image-text-warp section:hover,\r\n.mk-doc__image-text-warp div:hover,\r\n[data-lexical-decorator]:hover {\r\n outline: none !important;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]{\r\n user-select: none;\r\n white-space: initial;\r\n word-break: initial;\r\n cursor: pointer;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]>* {\r\n pointer-events: none;\r\n}\r\n\r\n/* 模块容器 */\r\n.mk-doc__module-grid{\r\n cursor: pointer;\r\n}\r\n ';
1
+ const DocEditorCss = ' \r\n.mk-doc__embedBlock {\r\n position: relative;\r\n z-index: 1;\r\n padding: 1px;\r\n cursor: pointer;\r\n}\r\n\r\n.mk-doc__embedBlock >*{ pointer-events: none; }\r\n\r\n/* 清除浮动 */\r\n.mk-doc-editor-stage::after{\r\n content: "";\r\n display: block;\r\n clear: both;\r\n width: 0;\r\n height: 0;\r\n font-size: 0;\r\n}\r\n/* 缩进 */\r\n.mk-doc-editor-stage * {\r\n --lexical-indent-base-value:2em\r\n}\r\n/* 光标样式 */\r\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\r\n.mk-doc__empty-mark::before,\r\n.mk-doc__br-brfore-mark::after{ \r\n content: "↩︎";\r\n color: #ccc;\r\n margin-left: 4px;\r\n cursor: text;\r\n user-select: none;\r\n pointer-events: none;\r\n position: absolute;\r\n font-size: 12px;\r\n height: 0;\r\n width: 1px; \r\n vertical-align: middle;\r\n}\r\n\r\n/* placeholder 模式 */\r\n.mk-doc-editor-stage.placeholder *::after,\r\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\r\n\r\n/* 选中样式 */\r\n.mk-doc__node-selection {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n/* hover 的标识线条 */\r\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\r\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\r\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\r\n outline: 1px solid #d7e6ff;\r\n}\r\n.mk-doc__image-text-warp p:hover,\r\n.mk-doc__image-text-warp section:hover,\r\n.mk-doc__image-text-warp div:hover,\r\n[data-lexical-decorator]:hover {\r\n outline: none !important;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]{\r\n user-select: none;\r\n white-space: initial;\r\n word-break: initial;\r\n cursor: pointer;\r\n}\r\n.mk-doc-editor-stage p>img ~ span[data-lexical-text]{\r\n display: inline-block;\r\n}\r\n.mk-doc-editor-stage [data-lexical-decorator]>* {\r\n pointer-events: none;\r\n}\r\n';
2
2
  export {
3
3
  DocEditorCss as default
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"doc-editor.css.js","sources":["../../../../../../src/components/basic/lexical-editor/assets/doc-editor.css?raw"],"sourcesContent":["export default \" \\r\\n.mk-doc__embedBlock {\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n padding: 1px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.mk-doc__embedBlock >*{ pointer-events: none; }\\r\\n\\r\\n/* 清除浮动 */\\r\\n.mk-doc-editor-stage::after{\\r\\n content: \\\"\\\";\\r\\n display: block;\\r\\n clear: both;\\r\\n width: 0;\\r\\n height: 0;\\r\\n font-size: 0;\\r\\n}\\r\\n/* 缩进 */\\r\\n.mk-doc-editor-stage * {\\r\\n --lexical-indent-base-value:2em\\r\\n}\\r\\n/* 光标样式 */\\r\\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\\r\\n.mk-doc__empty-mark::before,\\r\\n.mk-doc__br-brfore-mark::after{ \\r\\n content: \\\"↩︎\\\";\\r\\n color: #ccc;\\r\\n margin-left: 4px;\\r\\n cursor: text;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n position: absolute;\\r\\n font-size: 12px;\\r\\n height: 0;\\r\\n width: 1px; \\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n/* placeholder 模式 */\\r\\n.mk-doc-editor-stage.placeholder *::after,\\r\\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\\r\\n\\r\\n/* 选中样式 */\\r\\n.mk-doc__node-selection {\\r\\n outline: 2px solid rgb(60, 132, 244);\\r\\n}\\r\\n/* hover 的标识线条 */\\r\\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\\r\\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\\r\\n outline: 1px solid #d7e6ff;\\r\\n}\\r\\n.mk-doc__image-text-warp p:hover,\\r\\n.mk-doc__image-text-warp section:hover,\\r\\n.mk-doc__image-text-warp div:hover,\\r\\n[data-lexical-decorator]:hover {\\r\\n outline: none !important;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]{\\r\\n user-select: none;\\r\\n white-space: initial;\\r\\n word-break: initial;\\r\\n cursor: pointer;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]>* {\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n/* 模块容器 */\\r\\n.mk-doc__module-grid{\\r\\n cursor: pointer;\\r\\n}\\r\\n \""],"names":[],"mappings":"AAAA,MAAe,eAAA;"}
1
+ {"version":3,"file":"doc-editor.css.js","sources":["../../../../../../src/components/basic/lexical-editor/assets/doc-editor.css?raw"],"sourcesContent":["export default \" \\r\\n.mk-doc__embedBlock {\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n padding: 1px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.mk-doc__embedBlock >*{ pointer-events: none; }\\r\\n\\r\\n/* 清除浮动 */\\r\\n.mk-doc-editor-stage::after{\\r\\n content: \\\"\\\";\\r\\n display: block;\\r\\n clear: both;\\r\\n width: 0;\\r\\n height: 0;\\r\\n font-size: 0;\\r\\n}\\r\\n/* 缩进 */\\r\\n.mk-doc-editor-stage * {\\r\\n --lexical-indent-base-value:2em\\r\\n}\\r\\n/* 光标样式 */\\r\\n.mk-doc-editor-stage *:has(>span):not(a) > span:last-child::after,\\r\\n.mk-doc__empty-mark::before,\\r\\n.mk-doc__br-brfore-mark::after{ \\r\\n content: \\\"↩︎\\\";\\r\\n color: #ccc;\\r\\n margin-left: 4px;\\r\\n cursor: text;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n position: absolute;\\r\\n font-size: 12px;\\r\\n height: 0;\\r\\n width: 1px; \\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n/* placeholder 模式 */\\r\\n.mk-doc-editor-stage.placeholder *::after,\\r\\n.mk-doc-editor-stage.placeholder *::before{ display: none;}\\r\\n\\r\\n/* 选中样式 */\\r\\n.mk-doc__node-selection {\\r\\n outline: 2px solid rgb(60, 132, 244);\\r\\n}\\r\\n/* hover 的标识线条 */\\r\\n.mk-doc-editor-stage div:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage section:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage main:not([data-lexical-decorator]>*):hover,\\r\\n.mk-doc-editor-stage header:not([data-lexical-decorator]):hover,\\r\\n.mk-doc-editor-stage p:not([data-lexical-decorator]>*):hover{\\r\\n outline: 1px solid #d7e6ff;\\r\\n}\\r\\n.mk-doc__image-text-warp p:hover,\\r\\n.mk-doc__image-text-warp section:hover,\\r\\n.mk-doc__image-text-warp div:hover,\\r\\n[data-lexical-decorator]:hover {\\r\\n outline: none !important;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]{\\r\\n user-select: none;\\r\\n white-space: initial;\\r\\n word-break: initial;\\r\\n cursor: pointer;\\r\\n}\\r\\n.mk-doc-editor-stage p>img ~ span[data-lexical-text]{\\r\\n display: inline-block;\\r\\n}\\r\\n.mk-doc-editor-stage [data-lexical-decorator]>* {\\r\\n pointer-events: none;\\r\\n}\\r\\n\""],"names":[],"mappings":"AAAA,MAAe,eAAA;"}
@@ -1,5 +1,5 @@
1
1
  import { provide, onMounted, onUnmounted, inject } from "vue";
2
- import { createEditor, BLUR_COMMAND, $getRoot, $createParagraphNode, $isElementNode, $isTextNode, $getSelection } from "lexical";
2
+ import { createEditor, $getRoot, $createParagraphNode, $isElementNode, $isTextNode } from "lexical";
3
3
  import { mergeRegister } from "@lexical/utils";
4
4
  import { useMounted } from "./utils.js";
5
5
  import { generateNodesFromHtml } from "../utils/html.js";
@@ -12,7 +12,7 @@ import "@lexical/overflow";
12
12
  import "@lexical/text";
13
13
  import "@lexical/link";
14
14
  import "@lexical/rich-text";
15
- import { setSelected } from "./useElementBlockSelection.js";
15
+ import "./useElementBlockSelection.js";
16
16
  const LexicalEditorProviderKey = "LexicalEditorProviderKey";
17
17
  const HISTORY_MERGE_OPTIONS = { tag: "history-merge" };
18
18
  const EditorPlugins = [];
@@ -55,11 +55,12 @@ const useLexicalEditor = function(options, errHandle) {
55
55
  shortcutTools.push(...plugins.map((p) => p.plugin.shortcutTools ? p.plugin.shortcutTools(editor) : []).reduce((a, b) => a.concat(b)));
56
56
  useMounted(() => {
57
57
  return mergeRegister(
58
- // 焦点移除
59
- editor.registerCommand(BLUR_COMMAND, (event) => {
60
- setSelected(editor, true, $getRoot().__key);
61
- return false;
62
- }, 1),
58
+ // // 焦点移除
59
+ // editor.registerCommand<FocusEvent>(BLUR_COMMAND,(event:FocusEvent) => {
60
+ // // 选中根
61
+ // // setSelected(editor,true,$getRoot().__key)
62
+ // return false;
63
+ // }, 1),
63
64
  // 补空
64
65
  editor.registerUpdateListener(({ editorState }) => {
65
66
  editor.update(() => {
@@ -110,9 +111,6 @@ const useLexicalEditor = function(options, errHandle) {
110
111
  } else {
111
112
  root.append($createParagraphNode());
112
113
  }
113
- if ($getSelection() !== null) {
114
- root.getLastChild().select();
115
- }
116
114
  }, HISTORY_MERGE_OPTIONS);
117
115
  },
118
116
  editor
@@ -1 +1 @@
1
- {"version":3,"file":"lexicalEditor.js","sources":["../../../../../../src/components/basic/lexical-editor/composables/lexicalEditor.ts"],"sourcesContent":["\r\n\r\nimport { onMounted, provide, inject, reactive,onUnmounted } from 'vue'\r\nimport type { CreateEditorArgs, LexicalEditor, LexicalNode, NodeKey } from 'lexical'\r\nimport { $createParagraphNode, $getRoot, $getSelection, $isElementNode, $isParagraphNode, $isTextNode, BLUR_COMMAND, createEditor, ElementNode } from 'lexical'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport { useMounted } from './utils'\r\nimport { generateNodesFromHtml } from '../utils'\r\nimport { clearSelection, setSelected } from './useElementBlockSelection'\r\n\r\n\r\n/**\r\n * 编辑器模块\r\n */\r\nexport type LexicalEditorModule = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n options:Array<any>\r\n}\r\n\r\n/**\r\n * 编辑器模版类型\r\n */\r\nexport type LexicalEditorTemplate = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContextData = {\r\n importCss:string,\r\n importScript:string,\r\n importStyles:string,\r\n modules:Array<LexicalEditorModule>,\r\n templates:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 快捷工具条\r\n */\r\nexport type ShortcutToolsType = {\r\n exist:(node:LexicalNode)=>boolean,\r\n tools:(Array<{ key?:string, title:string,icon:string,action:(node:any,dom?:HTMLElement)=>unknown}> | ((nodeKey?:NodeKey | string)=>Array<any>|null))\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n */\r\nexport type LexicalEditorPlugin = {\r\n nodes?:Array<any>,\r\n tools?:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools?:(editor:LexicalEditor)=>Array<ShortcutToolsType>,\r\n useMounted:(editor:LexicalEditor)=>any,\r\n modules?:Array<LexicalEditorModule>,\r\n templates?:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContext = LexicalEditorContextData & {\r\n editor:LexicalEditor\r\n stageId:string,\r\n tools:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools:Array<ShortcutToolsType>\r\n}\r\n\r\n/**\r\n * 编辑器配置项\r\n */\r\nexport type LexicalEditorOptions = CreateEditorArgs & LexicalEditorContextData\r\n\r\n/**\r\n * 编辑器实例注入的key\r\n */\r\nconst LexicalEditorProviderKey = 'LexicalEditorProviderKey'\r\n\r\n/**\r\n * 历史合并选项\r\n */\r\nconst HISTORY_MERGE_OPTIONS = { tag: 'history-merge' }\r\n\r\n/**\r\n * 编辑器插件定义\r\n */\r\nconst EditorPlugins:Array<{namespace?:string,plugin:LexicalEditorPlugin}> = [];\r\n\r\n/**\r\n * 舞台全局数据\r\n */\r\nconst StageGlobalData = { num:0 }\r\n\r\n/**\r\n * 编辑器命名空间缓存\r\n */\r\nconst EditorNamespaceContextCache:any = {};\r\n\r\n \r\n/**\r\n * 注册编辑器插件\r\n * @param nodes \r\n */\r\nexport const registerEditorPlugin = function (plugin:LexicalEditorPlugin,namespace?:string) {\r\n EditorPlugins.push({namespace,plugin});\r\n}\r\n \r\n/**\r\n * \r\n * @param options 配置项 \r\n */\r\nexport const useLexicalEditor = function (options: LexicalEditorOptions, errHandle?: (error: Error) => void) {\r\n\r\n // 编号自增\r\n StageGlobalData.num++\r\n\r\n // 命名空间\r\n const namespace = options.namespace ?? `eidtor-${StageGlobalData.num}`;\r\n\r\n // 存在相同的空间则报错\r\n if(EditorNamespaceContextCache[namespace]){\r\n throw new Error(`编辑器命名空间【${namespace}】重复!`)\r\n }\r\n\r\n // 可以使用的插件列表\r\n const plugins = EditorPlugins.filter(p=>(!p.namespace || (p.namespace === namespace)))\r\n\r\n // 注册的节点\r\n const registerNodes:any = plugins.filter(p=>p.plugin.nodes).map(p=>p.plugin.nodes).reduce((a:any,b:any)=>a.concat(b))\r\n\r\n // 创建编辑器\r\n const editor = createEditor({\r\n editable: options.editable,\r\n html: options.html,\r\n namespace: namespace,\r\n nodes: options.nodes ? [...registerNodes, ...options.nodes] as any : registerNodes as any,\r\n theme: options.theme,\r\n onError: errHandle\r\n })\r\n\r\n // 挂载函数\r\n const mountHandles:any = plugins.filter(p=>p.plugin.useMounted).map(p=>p.plugin.useMounted)\r\n // 模版\r\n const templates:any = plugins.filter(p=>p.plugin.templates && p.plugin.templates.length).map(p=>p.plugin.templates).concat(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.template))\r\n // 模块\r\n const modules:any = plugins.filter(p=>p.plugin.modules && p.plugin.modules.length).map(p=>p.plugin.modules).concat(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.module))\r\n //快捷工具条\r\n const shortcutTools:Array<ShortcutToolsType> = []\r\n // 注入\r\n provide<LexicalEditorContext>(LexicalEditorProviderKey,EditorNamespaceContextCache[namespace] = {\r\n editor,stageId:`lexical-stage-${StageGlobalData.num}`,\r\n tools:plugins.map(p=>p.plugin.tools ?? []).reduce((a:any,b:any)=>a.concat(b)),\r\n shortcutTools,\r\n modules:options.modules.concat(modules),\r\n templates:options.templates.concat(templates),\r\n importCss:options.importCss,\r\n importScript:options.importScript,\r\n importStyles:options.importStyles \r\n })\r\n // \r\n shortcutTools.push(... plugins.map(p=>p.plugin.shortcutTools ? p.plugin.shortcutTools(editor):[]).reduce((a:any,b:any)=>a.concat(b)));\r\n\r\n useMounted(()=>{\r\n // 删除空容器\r\n return mergeRegister(\r\n // 焦点移除\r\n editor.registerCommand<FocusEvent>(BLUR_COMMAND,(event:FocusEvent) => {\r\n // 选中根\r\n setSelected(editor,true,$getRoot().__key)\r\n return false;\r\n }, 1),\r\n // 补空\r\n editor.registerUpdateListener(({ editorState }) => {\r\n \r\n editor.update(() => {\r\n const rootNode = $getRoot();\r\n // || !$isParagraphNode(rootNode.getLastChild())\r\n // 始终保持一个 p 存在\r\n if (rootNode.isEmpty()) { \r\n const p = $createParagraphNode()\r\n rootNode.append(p) \r\n // p.select();\r\n }\r\n\r\n //给所有空容器设置标识\r\n const list = [...rootNode.getChildren()];\r\n\r\n for(let i = 0; i<list.length;i++){\r\n\r\n const node = list[i];\r\n const el = editor.getElementByKey(node.getKey());\r\n\r\n if($isElementNode(node) && el){\r\n // 标识空容器\r\n if(node.isEmpty()){\r\n el.classList.add(\"mk-doc__empty-mark\");\r\n }\r\n else {\r\n el.classList.remove(\"mk-doc__empty-mark\");\r\n }\r\n \r\n list.push(...node.getChildren())\r\n }\r\n else if(el && $isTextNode(node)){\r\n // 标识br 前面的文本容器\r\n if(el?.nextElementSibling?.tagName.toLowerCase() == \"br\"){\r\n el.classList.add(\"mk-doc__br-brfore-mark\");\r\n }\r\n else{\r\n el.classList.remove(\"mk-doc__br-brfore-mark\");\r\n }\r\n }\r\n }\r\n })\r\n }),\r\n ...mountHandles.map((handle:any)=>handle(editor))\r\n ) \r\n })\r\n\r\n // 组件挂载之后\r\n onMounted(() => {\r\n\r\n // editor.blur(async ()=> await clearSelection(editor));\r\n\r\n editor.setEditable(options.editable !== undefined ? options.editable : true)\r\n\r\n // // 卸载组件之后 销毁编辑器实例\r\n onUnmounted(()=>{\r\n // 销毁这个命名空间的山修改文缓存\r\n delete EditorNamespaceContextCache[namespace];\r\n })\r\n })\r\n\r\n return { \r\n // 设置初始化内容\r\n setEditornitializeContent:(content?:string)=>{\r\n editor.update(() => {\r\n\r\n const root = $getRoot()\r\n\r\n root.clear();\r\n\r\n if(content){\r\n root.append(...generateNodesFromHtml(editor,content));\r\n }\r\n else{\r\n root.append($createParagraphNode())\r\n }\r\n\r\n // 设置选中 \r\n if ($getSelection() !== null) { (root.getLastChild() as ElementNode).select() } \r\n\r\n }, HISTORY_MERGE_OPTIONS)\r\n },\r\n editor \r\n }\r\n}\r\n\r\n/**\r\n * 获取当前编辑器上下文\r\n * @param namespace \r\n * @returns \r\n */\r\nexport const useLexicalEditorContext = function (namespace?:string) {\r\n\r\n const data = namespace ? EditorNamespaceContextCache[namespace] as LexicalEditorContext : inject<LexicalEditorContext>(LexicalEditorProviderKey);\r\n\r\n if(!data){ throw new Error(\"未获取到当前编辑器上下文!\"); }\r\n\r\n return {\r\n editor:data.editor,stageId:data.stageId,\r\n modules:data.modules ?? [],\r\n templates:data.templates ?? [],\r\n importCss:data.importCss ?? \"\",\r\n importScript:data.importScript ?? \"\",\r\n importStyles:data.importStyles ?? \"\",\r\n shortcutToolsList:data.shortcutTools,\r\n toolbarExtendPlugins :data.tools,\r\n // 查找模块\r\n findLexicalEditorModule(name:string):LexicalEditorModule|undefined{\r\n\r\n const module = data.modules.find(item=>item.name == name);\r\n \r\n if(module == null){\r\n console.warn(\"未知的模块:【\" + name + \"】\")\r\n }\r\n \r\n return module;\r\n },\r\n // 查找模版\r\n findLexicalEditorTemplate(name:string):LexicalEditorTemplate|undefined{\r\n\r\n const tempalte = data.templates.find(item=>item.name == name);\r\n \r\n if(tempalte == null){\r\n console.warn(\"未知的模版:【\" + name + \"】\")\r\n }\r\n \r\n return tempalte;\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模块定义\r\n */\r\nconst EditorModules:Array<{namespace?:string,module:LexicalEditorModule}> = [];\r\n\r\n/**\r\n * 注册模块\r\n * @param options \r\n */\r\nexport const registerLexicalEditorModule = (options:LexicalEditorModule,namespace?:string) => {\r\n\r\n if(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.module.name == options.name) >= 0){\r\n console.warn(`模块【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorModules.push({ namespace,module:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模块\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorModule = (name:string) => {\r\n\r\n for(let i = 0;i < EditorModules.length; i++){\r\n if(EditorModules[i].module.name == name){\r\n EditorModules.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模版定义\r\n */\r\nconst EditorTemplates:Array<{namespace?:string,template:LexicalEditorTemplate}> = [];\r\n\r\n/**\r\n * 注册模版\r\n * @param options \r\n */\r\nexport const registerLexicalEditorTemplate = (options:LexicalEditorTemplate,namespace?:string) => {\r\n\r\n if(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.template.name == options.name) >= 0){\r\n console.warn(`模版【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorTemplates.push({ namespace,template:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模版\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorTemplate = (name:string) => {\r\n\r\n for(let i = 0;i < EditorTemplates.length; i++){\r\n if(EditorTemplates[i].template.name == name){\r\n EditorTemplates.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// /**\r\n// * 初始化编辑器\r\n// * @param editor \r\n// * @param initialEditorState \r\n// * @returns \r\n// */\r\n// const initializeEditor = (editor: LexicalEditor, initialEditorState?: InitialEditorStateType): void => {\r\n\r\n// if (initialEditorState === null) { return }\r\n\r\n// if (initialEditorState === undefined) {\r\n \r\n// // 编辑内容为空的时候 默认创建一个 p\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) {\r\n\r\n// const paragraph = $createParagraphNode()\r\n\r\n// root.append(paragraph)\r\n\r\n// const activeElement = document.activeElement\r\n\r\n// if ($getSelection() !== null || (activeElement !== null && activeElement === editor.getRootElement())) {\r\n// paragraph.select()\r\n// }\r\n// }\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// }\r\n// else if (initialEditorState !== null) {\r\n\r\n// switch (typeof initialEditorState) {\r\n// case 'string': {\r\n// const parsedEditorState = editor.parseEditorState(initialEditorState)\r\n// editor.setEditorState(parsedEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'object': {\r\n// editor.setEditorState(initialEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'function': {\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) { initialEditorState(editor) }\r\n\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// }\r\n// }\r\n// }\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lexicalEditor.js","sources":["../../../../../../src/components/basic/lexical-editor/composables/lexicalEditor.ts"],"sourcesContent":["\r\n\r\nimport { onMounted, provide, inject, reactive,onUnmounted } from 'vue'\r\nimport type { CreateEditorArgs, LexicalEditor, LexicalNode, NodeKey } from 'lexical'\r\nimport { $createParagraphNode, $getRoot, $getSelection, $isElementNode, $isParagraphNode, $isTextNode, BLUR_COMMAND, createEditor, ElementNode } from 'lexical'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport { useMounted } from './utils'\r\nimport { generateNodesFromHtml } from '../utils'\r\nimport { clearSelection, setSelected } from './useElementBlockSelection'\r\n\r\n\r\n/**\r\n * 编辑器模块\r\n */\r\nexport type LexicalEditorModule = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n options:Array<any>\r\n}\r\n\r\n/**\r\n * 编辑器模版类型\r\n */\r\nexport type LexicalEditorTemplate = {\r\n name:string,\r\n title:string,\r\n cover?:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContextData = {\r\n importCss:string,\r\n importScript:string,\r\n importStyles:string,\r\n modules:Array<LexicalEditorModule>,\r\n templates:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 快捷工具条\r\n */\r\nexport type ShortcutToolsType = {\r\n exist:(node:LexicalNode)=>boolean,\r\n tools:(Array<{ key?:string, title:string,icon:string,action:(node:any,dom?:HTMLElement)=>unknown}> | ((nodeKey?:NodeKey | string)=>Array<any>|null))\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n */\r\nexport type LexicalEditorPlugin = {\r\n nodes?:Array<any>,\r\n tools?:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools?:(editor:LexicalEditor)=>Array<ShortcutToolsType>,\r\n useMounted:(editor:LexicalEditor)=>any,\r\n modules?:Array<LexicalEditorModule>,\r\n templates?:Array<LexicalEditorTemplate>\r\n}\r\n\r\n/**\r\n * 编辑器上下文\r\n */\r\nexport type LexicalEditorContext = LexicalEditorContextData & {\r\n editor:LexicalEditor\r\n stageId:string,\r\n tools:Array<{ icon: string; text:string, action:(editor:LexicalEditor)=>void,disbale?:(node:LexicalNode)=>boolean, sort:number }>,\r\n shortcutTools:Array<ShortcutToolsType>\r\n}\r\n\r\n/**\r\n * 编辑器配置项\r\n */\r\nexport type LexicalEditorOptions = CreateEditorArgs & LexicalEditorContextData\r\n\r\n/**\r\n * 编辑器实例注入的key\r\n */\r\nconst LexicalEditorProviderKey = 'LexicalEditorProviderKey'\r\n\r\n/**\r\n * 历史合并选项\r\n */\r\nconst HISTORY_MERGE_OPTIONS = { tag: 'history-merge' }\r\n\r\n/**\r\n * 编辑器插件定义\r\n */\r\nconst EditorPlugins:Array<{namespace?:string,plugin:LexicalEditorPlugin}> = [];\r\n\r\n/**\r\n * 舞台全局数据\r\n */\r\nconst StageGlobalData = { num:0 }\r\n\r\n/**\r\n * 编辑器命名空间缓存\r\n */\r\nconst EditorNamespaceContextCache:any = {};\r\n\r\n \r\n/**\r\n * 注册编辑器插件\r\n * @param nodes \r\n */\r\nexport const registerEditorPlugin = function (plugin:LexicalEditorPlugin,namespace?:string) {\r\n EditorPlugins.push({namespace,plugin});\r\n}\r\n \r\n/**\r\n * \r\n * @param options 配置项 \r\n */\r\nexport const useLexicalEditor = function (options: LexicalEditorOptions, errHandle?: (error: Error) => void) {\r\n\r\n // 编号自增\r\n StageGlobalData.num++\r\n\r\n // 命名空间\r\n const namespace = options.namespace ?? `eidtor-${StageGlobalData.num}`;\r\n\r\n // 存在相同的空间则报错\r\n if(EditorNamespaceContextCache[namespace]){\r\n throw new Error(`编辑器命名空间【${namespace}】重复!`)\r\n }\r\n\r\n // 可以使用的插件列表\r\n const plugins = EditorPlugins.filter(p=>(!p.namespace || (p.namespace === namespace)))\r\n\r\n // 注册的节点\r\n const registerNodes:any = plugins.filter(p=>p.plugin.nodes).map(p=>p.plugin.nodes).reduce((a:any,b:any)=>a.concat(b))\r\n\r\n // 创建编辑器\r\n const editor = createEditor({\r\n editable: options.editable,\r\n html: options.html,\r\n namespace: namespace,\r\n nodes: options.nodes ? [...registerNodes, ...options.nodes] as any : registerNodes as any,\r\n theme: options.theme,\r\n onError: errHandle\r\n })\r\n\r\n // 挂载函数\r\n const mountHandles:any = plugins.filter(p=>p.plugin.useMounted).map(p=>p.plugin.useMounted)\r\n // 模版\r\n const templates:any = plugins.filter(p=>p.plugin.templates && p.plugin.templates.length).map(p=>p.plugin.templates).concat(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.template))\r\n // 模块\r\n const modules:any = plugins.filter(p=>p.plugin.modules && p.plugin.modules.length).map(p=>p.plugin.modules).concat(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).map(item=>item.module))\r\n //快捷工具条\r\n const shortcutTools:Array<ShortcutToolsType> = []\r\n // 注入\r\n provide<LexicalEditorContext>(LexicalEditorProviderKey,EditorNamespaceContextCache[namespace] = {\r\n editor,stageId:`lexical-stage-${StageGlobalData.num}`,\r\n tools:plugins.map(p=>p.plugin.tools ?? []).reduce((a:any,b:any)=>a.concat(b)),\r\n shortcutTools,\r\n modules:options.modules.concat(modules),\r\n templates:options.templates.concat(templates),\r\n importCss:options.importCss,\r\n importScript:options.importScript,\r\n importStyles:options.importStyles \r\n })\r\n // \r\n shortcutTools.push(... plugins.map(p=>p.plugin.shortcutTools ? p.plugin.shortcutTools(editor):[]).reduce((a:any,b:any)=>a.concat(b)));\r\n\r\n useMounted(()=>{\r\n // 删除空容器\r\n return mergeRegister(\r\n // // 焦点移除\r\n // editor.registerCommand<FocusEvent>(BLUR_COMMAND,(event:FocusEvent) => {\r\n // // 选中根\r\n // // setSelected(editor,true,$getRoot().__key)\r\n // return false;\r\n // }, 1),\r\n // 补空\r\n editor.registerUpdateListener(({ editorState }) => {\r\n \r\n editor.update(() => {\r\n const rootNode = $getRoot();\r\n // || !$isParagraphNode(rootNode.getLastChild())\r\n // 始终保持一个 p 存在\r\n if (rootNode.isEmpty()) { \r\n const p = $createParagraphNode()\r\n rootNode.append(p) \r\n }\r\n\r\n //给所有空容器设置标识\r\n const list = [...rootNode.getChildren()];\r\n\r\n for(let i = 0; i<list.length;i++){\r\n\r\n const node = list[i];\r\n const el = editor.getElementByKey(node.getKey());\r\n\r\n if($isElementNode(node) && el){\r\n // 标识空容器\r\n if(node.isEmpty()){\r\n el.classList.add(\"mk-doc__empty-mark\");\r\n }\r\n else {\r\n el.classList.remove(\"mk-doc__empty-mark\");\r\n }\r\n \r\n list.push(...node.getChildren())\r\n }\r\n else if(el && $isTextNode(node)){\r\n // 标识br 前面的文本容器\r\n if(el?.nextElementSibling?.tagName.toLowerCase() == \"br\"){\r\n el.classList.add(\"mk-doc__br-brfore-mark\");\r\n }\r\n else{\r\n el.classList.remove(\"mk-doc__br-brfore-mark\");\r\n }\r\n }\r\n }\r\n })\r\n }),\r\n ...mountHandles.map((handle:any)=>handle(editor))\r\n ) \r\n })\r\n\r\n // 组件挂载之后\r\n onMounted(() => {\r\n\r\n // editor.blur(async ()=> await clearSelection(editor));\r\n\r\n editor.setEditable(options.editable !== undefined ? options.editable : true)\r\n\r\n // // 卸载组件之后 销毁编辑器实例\r\n onUnmounted(()=>{\r\n // 销毁这个命名空间的山修改文缓存\r\n delete EditorNamespaceContextCache[namespace];\r\n })\r\n })\r\n\r\n return { \r\n // 设置初始化内容\r\n setEditornitializeContent:(content?:string)=>{\r\n editor.update(() => {\r\n\r\n const root = $getRoot()\r\n\r\n root.clear();\r\n\r\n if(content){\r\n root.append(...generateNodesFromHtml(editor,content));\r\n }\r\n else{\r\n root.append($createParagraphNode())\r\n }\r\n\r\n // // 设置选中 \r\n // if ($getSelection() == null) { \r\n // setSelected(editor,true,root.getLastChild()?.getKey() ?? \"\")\r\n // } \r\n\r\n }, HISTORY_MERGE_OPTIONS)\r\n },\r\n editor \r\n }\r\n}\r\n\r\n/**\r\n * 获取当前编辑器上下文\r\n * @param namespace \r\n * @returns \r\n */\r\nexport const useLexicalEditorContext = function (namespace?:string) {\r\n\r\n const data = namespace ? EditorNamespaceContextCache[namespace] as LexicalEditorContext : inject<LexicalEditorContext>(LexicalEditorProviderKey);\r\n\r\n if(!data){ throw new Error(\"未获取到当前编辑器上下文!\"); }\r\n\r\n return {\r\n editor:data.editor,stageId:data.stageId,\r\n modules:data.modules ?? [],\r\n templates:data.templates ?? [],\r\n importCss:data.importCss ?? \"\",\r\n importScript:data.importScript ?? \"\",\r\n importStyles:data.importStyles ?? \"\",\r\n shortcutToolsList:data.shortcutTools,\r\n toolbarExtendPlugins :data.tools,\r\n // 查找模块\r\n findLexicalEditorModule(name:string):LexicalEditorModule|undefined{\r\n\r\n const module = data.modules.find(item=>item.name == name);\r\n \r\n if(module == null){\r\n console.warn(\"未知的模块:【\" + name + \"】\")\r\n }\r\n \r\n return module;\r\n },\r\n // 查找模版\r\n findLexicalEditorTemplate(name:string):LexicalEditorTemplate|undefined{\r\n\r\n const tempalte = data.templates.find(item=>item.name == name);\r\n \r\n if(tempalte == null){\r\n console.warn(\"未知的模版:【\" + name + \"】\")\r\n }\r\n \r\n return tempalte;\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模块定义\r\n */\r\nconst EditorModules:Array<{namespace?:string,module:LexicalEditorModule}> = [];\r\n\r\n/**\r\n * 注册模块\r\n * @param options \r\n */\r\nexport const registerLexicalEditorModule = (options:LexicalEditorModule,namespace?:string) => {\r\n\r\n if(EditorModules.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.module.name == options.name) >= 0){\r\n console.warn(`模块【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorModules.push({ namespace,module:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模块\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorModule = (name:string) => {\r\n\r\n for(let i = 0;i < EditorModules.length; i++){\r\n if(EditorModules[i].module.name == name){\r\n EditorModules.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 编辑器模版定义\r\n */\r\nconst EditorTemplates:Array<{namespace?:string,template:LexicalEditorTemplate}> = [];\r\n\r\n/**\r\n * 注册模版\r\n * @param options \r\n */\r\nexport const registerLexicalEditorTemplate = (options:LexicalEditorTemplate,namespace?:string) => {\r\n\r\n if(EditorTemplates.filter(item=>!item.namespace || item.namespace === namespace).findIndex(item=>item.template.name == options.name) >= 0){\r\n console.warn(`模版【${options.title}】重复注册!`);\r\n }\r\n else{\r\n EditorTemplates.push({ namespace,template:options});\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模版\r\n * @param name \r\n */\r\nexport const unRegisterLexicalEditorTemplate = (name:string) => {\r\n\r\n for(let i = 0;i < EditorTemplates.length; i++){\r\n if(EditorTemplates[i].template.name == name){\r\n EditorTemplates.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// /**\r\n// * 初始化编辑器\r\n// * @param editor \r\n// * @param initialEditorState \r\n// * @returns \r\n// */\r\n// const initializeEditor = (editor: LexicalEditor, initialEditorState?: InitialEditorStateType): void => {\r\n\r\n// if (initialEditorState === null) { return }\r\n\r\n// if (initialEditorState === undefined) {\r\n \r\n// // 编辑内容为空的时候 默认创建一个 p\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) {\r\n\r\n// const paragraph = $createParagraphNode()\r\n\r\n// root.append(paragraph)\r\n\r\n// const activeElement = document.activeElement\r\n\r\n// if ($getSelection() !== null || (activeElement !== null && activeElement === editor.getRootElement())) {\r\n// paragraph.select()\r\n// }\r\n// }\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// }\r\n// else if (initialEditorState !== null) {\r\n\r\n// switch (typeof initialEditorState) {\r\n// case 'string': {\r\n// const parsedEditorState = editor.parseEditorState(initialEditorState)\r\n// editor.setEditorState(parsedEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'object': {\r\n// editor.setEditorState(initialEditorState, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// case 'function': {\r\n// editor.update(() => {\r\n\r\n// const root = $getRoot()\r\n\r\n// if (root.isEmpty()) { initialEditorState(editor) }\r\n\r\n// }, HISTORY_MERGE_OPTIONS)\r\n// break\r\n// }\r\n// }\r\n// }\r\n// }\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAmFA,MAAM,2BAA2B;AAKjC,MAAM,wBAAwB,EAAE,KAAK;AAKrC,MAAM,gBAAsE,CAAA;AAK5E,MAAM,kBAAkB,EAAE,KAAI;AAK9B,MAAM,8BAAkC,CAAA;AAO3B,MAAA,uBAAuB,SAAU,QAA2B,WAAmB;AAC1F,gBAAc,KAAK,EAAC,WAAU,OAAO,CAAA;AACvC;AAMa,MAAA,mBAAmB,SAAU,SAA+B,WAAoC;AAG3F,kBAAA;AAGhB,QAAM,YAAY,QAAQ,aAAa,UAAU,gBAAgB,GAAG;AAGjE,MAAA,4BAA4B,SAAS,GAAE;AACxC,UAAM,IAAI,MAAM,WAAW,SAAS,MAAM;AAAA,EAC5C;AAGM,QAAA,UAAW,cAAc,OAAO,CAAA,MAAI,CAAC,EAAE,aAAc,EAAE,cAAc,SAAW;AAGhF,QAAA,gBAAoB,QAAQ,OAAO,CAAA,MAAG,EAAE,OAAO,KAAK,EAAE,IAAI,CAAA,MAAG,EAAE,OAAO,KAAK,EAAE,OAAO,CAAC,GAAM,MAAQ,EAAE,OAAO,CAAC,CAAC;AAGpH,QAAM,SAAS,aAAa;AAAA,IAC1B,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,OAAO,QAAQ,QAAQ,CAAC,GAAG,eAAe,GAAG,QAAQ,KAAK,IAAW;AAAA,IACrE,OAAO,QAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACV;AAGD,QAAM,eAAmB,QAAQ,OAAO,CAAA,MAAG,EAAE,OAAO,UAAU,EAAE,IAAI,CAAA,MAAG,EAAE,OAAO,UAAU;AAE1F,QAAM,YAAgB,QAAQ,OAAO,CAAA,MAAG,EAAE,OAAO,aAAa,EAAE,OAAO,UAAU,MAAM,EAAE,IAAI,OAAG,EAAE,OAAO,SAAS,EAAE,OAAO,gBAAgB,OAAO,CAAA,SAAM,CAAC,KAAK,aAAa,KAAK,cAAc,SAAS,EAAE,IAAI,CAAM,SAAA,KAAK,QAAQ,CAAC;AAEjO,QAAM,UAAc,QAAQ,OAAO,CAAA,MAAG,EAAE,OAAO,WAAW,EAAE,OAAO,QAAQ,MAAM,EAAE,IAAI,OAAG,EAAE,OAAO,OAAO,EAAE,OAAO,cAAc,OAAO,CAAA,SAAM,CAAC,KAAK,aAAa,KAAK,cAAc,SAAS,EAAE,IAAI,CAAM,SAAA,KAAK,MAAM,CAAC;AAErN,QAAM,gBAAyC,CAAA;AAEjB,UAAA,0BAAyB,4BAA4B,SAAS,IAAI;AAAA,IAC9F;AAAA,IAAO,SAAQ,iBAAiB,gBAAgB,GAAG;AAAA,IACnD,OAAM,QAAQ,IAAI,CAAG,MAAA,EAAE,OAAO,SAAS,CAAE,CAAA,EAAE,OAAO,CAAC,GAAM,MAAQ,EAAE,OAAO,CAAC,CAAC;AAAA,IAC5E;AAAA,IACA,SAAQ,QAAQ,QAAQ,OAAO,OAAO;AAAA,IACtC,WAAU,QAAQ,UAAU,OAAO,SAAS;AAAA,IAC5C,WAAU,QAAQ;AAAA,IAClB,cAAa,QAAQ;AAAA,IACrB,cAAa,QAAQ;AAAA,EAAA,CACtB;AAEa,gBAAA,KAAK,GAAI,QAAQ,IAAI,CAAA,MAAG,EAAE,OAAO,gBAAgB,EAAE,OAAO,cAAc,MAAM,IAAE,CAAA,CAAE,EAAE,OAAO,CAAC,GAAM,MAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpI,aAAW,MAAI;AAEL,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQN,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AAEjD,eAAO,OAAO,MAAM;;AAClB,gBAAM,WAAW;AAGb,cAAA,SAAS,WAAW;AACtB,kBAAM,IAAI;AACV,qBAAS,OAAO,CAAC;AAAA,UACnB;AAGA,gBAAM,OAAO,CAAC,GAAG,SAAS,YAAa,CAAA;AAEvC,mBAAQ,IAAI,GAAG,IAAE,KAAK,QAAO,KAAI;AAEzB,kBAAA,OAAO,KAAK,CAAC;AACnB,kBAAM,KAAK,OAAO,gBAAgB,KAAK,OAAQ,CAAA;AAE5C,gBAAA,eAAe,IAAI,KAAK,IAAG;AAEzB,kBAAA,KAAK,WAAU;AACb,mBAAA,UAAU,IAAI,oBAAoB;AAAA,cAAA,OAElC;AACA,mBAAA,UAAU,OAAO,oBAAoB;AAAA,cAC1C;AAEA,mBAAK,KAAK,GAAG,KAAK,YAAa,CAAA;AAAA,YAEzB,WAAA,MAAM,YAAY,IAAI,GAAE;AAE9B,oBAAG,8BAAI,uBAAJ,mBAAwB,QAAQ,kBAAiB,MAAK;AACpD,mBAAA,UAAU,IAAI,wBAAwB;AAAA,cAAA,OAEvC;AACC,mBAAA,UAAU,OAAO,wBAAwB;AAAA,cAC9C;AAAA,YACF;AAAA,UACF;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,MACD,GAAG,aAAa,IAAI,CAAC,WAAa,OAAO,MAAM,CAAC;AAAA,IAAA;AAAA,EAClD,CACD;AAGD,YAAU,MAAM;AAId,WAAO,YAAY,QAAQ,aAAa,SAAY,QAAQ,WAAW,IAAI;AAG3E,gBAAY,MAAI;AAEd,aAAO,4BAA4B,SAAS;AAAA,IAAA,CAC7C;AAAA,EAAA,CACF;AAEM,SAAA;AAAA;AAAA,IAEL,2BAA0B,CAAC,YAAkB;AAC3C,aAAO,OAAO,MAAM;AAElB,cAAM,OAAO;AAEb,aAAK,MAAM;AAEX,YAAG,SAAQ;AACT,eAAK,OAAO,GAAG,sBAAsB,QAAO,OAAO,CAAC;AAAA,QAAA,OAElD;AACG,eAAA,OAAO,sBAAsB;AAAA,QACpC;AAAA,SAOC,qBAAqB;AAAA,IAC1B;AAAA,IACA;AAAA,EAAA;AAEJ;AAOa,MAAA,0BAA0B,SAAU,WAAmB;AAElE,QAAM,OAAO,YAAY,4BAA4B,SAAS,IAA4B,OAA6B,wBAAwB;AAE/I,MAAG,CAAC,MAAK;AAAS,UAAA,IAAI,MAAM,eAAe;AAAA,EAAI;AAExC,SAAA;AAAA,IACL,QAAO,KAAK;AAAA,IAAO,SAAQ,KAAK;AAAA,IAChC,SAAQ,KAAK,WAAW,CAAC;AAAA,IACzB,WAAU,KAAK,aAAa,CAAC;AAAA,IAC7B,WAAU,KAAK,aAAa;AAAA,IAC5B,cAAa,KAAK,gBAAgB;AAAA,IAClC,cAAa,KAAK,gBAAgB;AAAA,IAClC,mBAAkB,KAAK;AAAA,IACvB,sBAAsB,KAAK;AAAA;AAAA,IAE3B,wBAAwB,MAA0C;AAEhE,YAAM,SAAS,KAAK,QAAQ,KAAK,CAAM,SAAA,KAAK,QAAQ,IAAI;AAExD,UAAG,UAAU,MAAK;AACR,gBAAA,KAAK,YAAY,OAAO,GAAG;AAAA,MACrC;AAEO,aAAA;AAAA,IACT;AAAA;AAAA,IAEA,0BAA0B,MAA4C;AAEpE,YAAM,WAAW,KAAK,UAAU,KAAK,CAAM,SAAA,KAAK,QAAQ,IAAI;AAE5D,UAAG,YAAY,MAAK;AACV,gBAAA,KAAK,YAAY,OAAO,GAAG;AAAA,MACrC;AAEO,aAAA;AAAA,IACT;AAAA,EAAA;AAEJ;AAKA,MAAM,gBAAsE,CAAA;AAM/D,MAAA,8BAA8B,CAAC,SAA4B,cAAsB;AAE5F,MAAG,cAAc,OAAO,CAAA,SAAM,CAAC,KAAK,aAAa,KAAK,cAAc,SAAS,EAAE,UAAU,UAAM,KAAK,OAAO,QAAQ,QAAQ,IAAI,KAAK,GAAE;AACpI,YAAQ,KAAK,MAAM,QAAQ,KAAK,QAAQ;AAAA,EAAA,OAEtC;AACF,kBAAc,KAAK,EAAE,WAAU,QAAO,QAAQ,CAAA;AAAA,EAChD;AACF;AAMa,MAAA,gCAAgC,CAAC,SAAgB;AAE5D,WAAQ,IAAI,GAAE,IAAI,cAAc,QAAQ,KAAI;AAC1C,QAAG,cAAc,CAAC,EAAE,OAAO,QAAQ,MAAK;AACxB,oBAAA,OAAO,GAAE,CAAC;AACxB;AAAA,IACF;AAAA,EACF;AACF;AAKA,MAAM,kBAA4E,CAAA;AAMrE,MAAA,gCAAgC,CAAC,SAA8B,cAAsB;AAEhG,MAAG,gBAAgB,OAAO,CAAA,SAAM,CAAC,KAAK,aAAa,KAAK,cAAc,SAAS,EAAE,UAAU,UAAM,KAAK,SAAS,QAAQ,QAAQ,IAAI,KAAK,GAAE;AACxI,YAAQ,KAAK,MAAM,QAAQ,KAAK,QAAQ;AAAA,EAAA,OAEtC;AACF,oBAAgB,KAAK,EAAE,WAAU,UAAS,QAAQ,CAAA;AAAA,EACpD;AACF;AAMa,MAAA,kCAAkC,CAAC,SAAgB;AAE9D,WAAQ,IAAI,GAAE,IAAI,gBAAgB,QAAQ,KAAI;AAC5C,QAAG,gBAAgB,CAAC,EAAE,SAAS,QAAQ,MAAK;AAC1B,sBAAA,OAAO,GAAE,CAAC;AAC1B;AAAA,IACF;AAAA,EACF;AACF;"}
@@ -116,6 +116,12 @@ class ImageNode extends HtmlElementDecoratorNode {
116
116
  }
117
117
  return false;
118
118
  }
119
+ /**
120
+ * @returns
121
+ */
122
+ isInline() {
123
+ return true;
124
+ }
119
125
  }
120
126
  function $createImageNode(src, alt, className, style) {
121
127
  return new ImageNode(src, alt, className, style);
@@ -1 +1 @@
1
- {"version":3,"file":"ImageNode.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/ImageNode.ts"],"sourcesContent":["\r\nimport type {\r\n DOMConversionMap,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n SerializedLexicalNode,\r\n LexicalEditor\r\n} from 'lexical'\r\nimport { Component } from 'vue';\r\nimport { HtmlElementDecoratorNode,SerializedHtmlElementDecoratorNode } from \"./HtmlElementDecoratorNode\"\r\nimport { type LexicalCommand, createCommand } from 'lexical'\r\n\r\n/**\r\n * 插入图片指令\r\n */\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<{src:string,alt?:string,style?:string}> = createCommand('INSERT_IMAGE_COMMAND')\r\n\r\n// 默认图片\r\nconst ImageDefaultSrc = \"data:image/png;base64,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\";\r\n\r\n/**\r\n * 图片节点序列化\r\n */\r\nexport type SerializedImageNode = Spread<{ src: string,alt?:string }, SerializedHtmlElementDecoratorNode>\r\n\r\n/** \r\n * 定义图片节点\r\n */\r\nexport class ImageNode extends HtmlElementDecoratorNode {\r\n __src: string\r\n __alt?:string\r\n\r\n static getType(): string { return 'image' }\r\n\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(node.__src, node.__alt,node.__class,node.__style,node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n return $createImageNode(serializedNode.src,serializedNode.alt,serializedNode.class,serializedNode.style)\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: (el: HTMLElement) => {\r\n const src = el.getAttribute('src');\r\n const alt = el.getAttribute('alt');\r\n return el.tagName.toLowerCase() == \"img\" ? {\r\n conversion: (domNode: HTMLElement) => {\r\n return { \r\n node:$createImageNode(src ?? \"\",alt ?? undefined,domNode.className,domNode.getAttribute(\"style\") ?? \"\") \r\n };\r\n },\r\n priority: 1\r\n } : null\r\n },\r\n }\r\n }\r\n\r\n constructor(src: string,alt?:string,className?:string,style?:string, key?: NodeKey) {\r\n super(\"img\",className,style,key)\r\n this.__src = src\r\n this.__alt = alt\r\n }\r\n\r\n /**\r\n * 隔离渲染函数\r\n * @param editor \r\n * @param config \r\n * @returns \r\n */\r\n decorate(editor: LexicalEditor, config: EditorConfig): Component | null {\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 导出JSON\r\n * @returns \r\n */\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: this.getType(),\r\n version: 1,\r\n src: this.__src,\r\n alt: this.__alt\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 设置src\r\n * @param src \r\n * @returns \r\n */\r\n setSrc(src:string) {\r\n const self = this.getWritable();\r\n self.__src = src || \"\";\r\n return this;\r\n }\r\n\r\n /**\r\n * 设置 alt\r\n * @param alt \r\n * @returns \r\n */\r\n setAlt(alt:string) {\r\n const self = this.getWritable();\r\n self.__alt= alt || \"\";\r\n return this;\r\n }\r\n /**\r\n * 创建DOM\r\n * @param config \r\n * @returns \r\n */\r\n createDOM(config: EditorConfig): HTMLElement {\r\n\r\n const element = super.createDOM(config);\r\n\r\n if(this.__src){\r\n element.setAttribute('src', this.__src) \r\n }\r\n else{\r\n element.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n element.setAttribute('alt', this.__alt)\r\n }\r\n\r\n return element\r\n }\r\n\r\n /**\r\n * 更新DOM\r\n * @param _prevNode \r\n * @param _dom \r\n * @param _config \r\n * @returns \r\n */\r\n updateDOM(prevNode: LexicalNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n super.updateDOM(prevNode,dom,config);\r\n if(this.__src){\r\n dom.setAttribute('src', this.__src) \r\n }\r\n else{\r\n dom.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n dom.setAttribute('alt', this.__alt)\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * 创建图片节点\r\n * @param src \r\n * @returns \r\n */\r\nexport function $createImageNode(src: string,alt?:string,className?:string,style?:string): ImageNode {\r\n return new ImageNode(src,alt,className,style)\r\n}\r\n\r\n/**\r\n * 判断是否是图片节点\r\n * @param node \r\n * @returns \r\n */\r\nexport function $isImageNode(\r\n node: ImageNode | LexicalNode | null | undefined,\r\n): node is ImageNode {\r\n return node instanceof ImageNode\r\n}\r\n"],"names":[],"mappings":";;;;;AAkBa,MAAA,uBAA+E,cAAc,sBAAsB;AAGhI,MAAM,kBAAkB;AAUjB,MAAM,kBAAkB,yBAAyB;AAAA,EAgCtD,YAAY,KAAY,KAAY,WAAkB,OAAe,KAAe;AAC5E,UAAA,OAAM,WAAU,OAAM,GAAG;AAhCjC;AACA;AAgCE,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAhCA,OAAO,UAAkB;AAAS,WAAA;AAAA,EAAQ;AAAA,EAG1C,OAAO,MAAM,MAA4B;AAChC,WAAA,IAAI,UAAU,KAAK,OAAQ,KAAK,OAAM,KAAK,SAAQ,KAAK,SAAQ,KAAK,KAAK;AAAA,EACnF;AAAA,EAEA,OAAO,WAAW,gBAAgD;AACzD,WAAA,iBAAiB,eAAe,KAAI,eAAe,KAAI,eAAe,OAAM,eAAe,KAAK;AAAA,EACzG;AAAA,EAEA,OAAO,YAAqC;AACnC,WAAA;AAAA,MACL,KAAK,CAAC,OAAoB;AAClB,cAAA,MAAM,GAAG,aAAa,KAAK;AAC3B,cAAA,MAAM,GAAG,aAAa,KAAK;AACjC,eAAO,GAAG,QAAQ,YAAY,KAAK,QAAU;AAAA,UAC3C,YAAY,CAAC,YAAyB;AAC7B,mBAAA;AAAA,cACL,MAAK,iBAAiB,OAAO,IAAG,OAAO,QAAU,QAAQ,WAAU,QAAQ,aAAa,OAAO,KAAK,EAAE;AAAA,YAAA;AAAA,UAE1G;AAAA,UACA,UAAU;AAAA,QACR,IAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS,QAAuB,QAAwC;AAE/D,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAkC;AACzB,WAAA;AAAA,MACL,GAAG,MAAM,WAAW;AAAA,MACpB,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS;AAAA,MACT,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,IAAA;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAY;AACX,UAAA,OAAO,KAAK;AAClB,SAAK,QAAQ,OAAO;AACb,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAY;AACX,UAAA,OAAO,KAAK;AAClB,SAAK,QAAO,OAAO;AACZ,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAmC;AAErC,UAAA,UAAU,MAAM,UAAU,MAAM;AAEtC,QAAG,KAAK,OAAM;AACJ,cAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IAAA,OAEpC;AACM,cAAA,aAAa,OAAO,eAAe;AAAA,IAC7C;AAEA,QAAG,KAAK,OAAM;AACJ,cAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IACxC;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,UAAuB,KAAkB,QAA+B;AAC1E,UAAA,UAAU,UAAS,KAAI,MAAM;AACnC,QAAG,KAAK,OAAM;AACR,UAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IAAA,OAEhC;AACE,UAAA,aAAa,OAAO,eAAe;AAAA,IACzC;AAEA,QAAG,KAAK,OAAM;AACR,UAAA,aAAa,OAAO,KAAK,KAAK;AAAA,IACpC;AACO,WAAA;AAAA,EACT;AACF;AAQO,SAAS,iBAAiB,KAAY,KAAY,WAAkB,OAA0B;AACnG,SAAO,IAAI,UAAU,KAAI,KAAI,WAAU,KAAK;AAC9C;AAOO,SAAS,aACd,MACmB;AACnB,SAAO,gBAAgB;AACzB;"}
1
+ {"version":3,"file":"ImageNode.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/ImageNode.ts"],"sourcesContent":["\r\nimport type {\r\n DOMConversionMap,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n SerializedLexicalNode,\r\n LexicalEditor\r\n} from 'lexical'\r\nimport { Component } from 'vue';\r\nimport { HtmlElementDecoratorNode,SerializedHtmlElementDecoratorNode } from \"./HtmlElementDecoratorNode\"\r\nimport { type LexicalCommand, createCommand } from 'lexical'\r\n\r\n/**\r\n * 插入图片指令\r\n */\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<{src:string,alt?:string,style?:string}> = createCommand('INSERT_IMAGE_COMMAND')\r\n\r\n// 默认图片\r\nconst ImageDefaultSrc = \"data:image/png;base64,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\";\r\n\r\n/**\r\n * 图片节点序列化\r\n */\r\nexport type SerializedImageNode = Spread<{ src: string,alt?:string }, SerializedHtmlElementDecoratorNode>\r\n\r\n/** \r\n * 定义图片节点\r\n */\r\nexport class ImageNode extends HtmlElementDecoratorNode {\r\n __src: string\r\n __alt?:string\r\n\r\n static getType(): string { return 'image' }\r\n\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(node.__src, node.__alt,node.__class,node.__style,node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n return $createImageNode(serializedNode.src,serializedNode.alt,serializedNode.class,serializedNode.style)\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: (el: HTMLElement) => {\r\n const src = el.getAttribute('src');\r\n const alt = el.getAttribute('alt');\r\n return el.tagName.toLowerCase() == \"img\" ? {\r\n conversion: (domNode: HTMLElement) => {\r\n return { \r\n node:$createImageNode(src ?? \"\",alt ?? undefined,domNode.className,domNode.getAttribute(\"style\") ?? \"\") \r\n };\r\n },\r\n priority: 1\r\n } : null\r\n },\r\n }\r\n }\r\n\r\n constructor(src: string,alt?:string,className?:string,style?:string, key?: NodeKey) {\r\n super(\"img\",className,style,key)\r\n this.__src = src\r\n this.__alt = alt\r\n }\r\n\r\n /**\r\n * 隔离渲染函数\r\n * @param editor \r\n * @param config \r\n * @returns \r\n */\r\n decorate(editor: LexicalEditor, config: EditorConfig): Component | null {\r\n return null;\r\n }\r\n\r\n /**\r\n * 导出JSON\r\n * @returns \r\n */\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: this.getType(),\r\n version: 1,\r\n src: this.__src,\r\n alt: this.__alt\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 设置src\r\n * @param src \r\n * @returns \r\n */\r\n setSrc(src:string) {\r\n const self = this.getWritable();\r\n self.__src = src || \"\";\r\n return this;\r\n }\r\n\r\n /**\r\n * 设置 alt\r\n * @param alt \r\n * @returns \r\n */\r\n setAlt(alt:string) {\r\n const self = this.getWritable();\r\n self.__alt= alt || \"\";\r\n return this;\r\n }\r\n /**\r\n * 创建DOM\r\n * @param config \r\n * @returns \r\n */\r\n createDOM(config: EditorConfig): HTMLElement {\r\n\r\n const element = super.createDOM(config);\r\n\r\n if(this.__src){\r\n element.setAttribute('src', this.__src) \r\n }\r\n else{\r\n element.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n element.setAttribute('alt', this.__alt)\r\n }\r\n\r\n return element\r\n }\r\n\r\n /**\r\n * 更新DOM\r\n * @param _prevNode \r\n * @param _dom \r\n * @param _config \r\n * @returns \r\n */\r\n updateDOM(prevNode: ImageNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n super.updateDOM(prevNode,dom,config);\r\n if(this.__src){\r\n dom.setAttribute('src', this.__src) \r\n }\r\n else{\r\n dom.setAttribute('src', ImageDefaultSrc) \r\n }\r\n\r\n if(this.__alt){\r\n dom.setAttribute('alt', this.__alt)\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @returns \r\n */\r\n isInline() { return true; }\r\n}\r\n\r\n\r\n/**\r\n * 创建图片节点\r\n * @param src \r\n * @returns \r\n */\r\nexport function $createImageNode(src: string,alt?:string,className?:string,style?:string): ImageNode {\r\n return new ImageNode(src,alt,className,style)\r\n}\r\n\r\n/**\r\n * 判断是否是图片节点\r\n * @param node \r\n * @returns \r\n */\r\nexport function $isImageNode(\r\n node: ImageNode | LexicalNode | null | undefined,\r\n): node is ImageNode {\r\n return node instanceof ImageNode\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Template.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/Template.ts"],"sourcesContent":["\r\n\r\nimport { type LexicalCommand, createCommand} from 'lexical'\r\n\r\n/**\r\n * 插入模版块指令\r\n */\r\nexport const INSERT_TEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_TEMPLATE_COMMAND')\r\n\r\n/**\r\n * 插入HTML模版块指令 \r\n */\r\nexport const INSERT_HTMLTEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_HTMLTEMPLATE_COMMAND')\r\n"],"names":[],"mappings":";AAOa,MAAA,0BAAkD,cAAc,yBAAyB;AAKzF,MAAA,8BAAsD,cAAc,6BAA6B;"}
1
+ {"version":3,"file":"Template.js","sources":["../../../../../../src/components/basic/lexical-editor/nodes/Template.ts"],"sourcesContent":["\r\n\r\nimport { type LexicalCommand, createCommand} from 'lexical'\r\n\r\n/**\r\n * 插入模版块指令\r\n */\r\nexport const INSERT_TEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_TEMPLATE_COMMAND')\r\n\r\n/**\r\n * 插入HTML模版块指令 \r\n */\r\nexport const INSERT_HTMLTEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_HTMLTEMPLATE_COMMAND')\r\n"],"names":[],"mappings":";AAOa,MAAA,0BAAkD,cAAc,yBAAyB;AAKzF,MAAA,8BAAsD,cAAc,6BAA6B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AutoFocusPlugin.vue.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/AutoFocusPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { nextTick, onMounted } from 'vue'\r\nimport { useLexicalEditorContext } from '../composables'\r\n\r\nconst props = defineProps<{\r\n defaultSelection?: 'rootStart' | 'rootEnd'\r\n}>()\r\n\r\nconst { editor } = useLexicalEditorContext();\r\n\r\nonMounted(() => {\r\n\r\n nextTick(() => {\r\n editor.focus(\r\n () => {\r\n // If we try and move selection to the same point with setBaseAndExtent, it won't\r\n // trigger a re-focus on the element. So in the case this occurs, we'll need to correct it.\r\n // Normally this is fine, Selection API !== Focus API, but fore the intents of the naming\r\n // of this plugin, which should preserve focus too.\r\n const activeElement = document.activeElement\r\n const rootElement = editor.getRootElement() as HTMLDivElement\r\n if (\r\n rootElement !== null\r\n && (activeElement === null || !rootElement.contains(activeElement))\r\n ) {\r\n // Note: preventScroll won't work in Webkit.\r\n rootElement.focus({ preventScroll: true })\r\n }\r\n },\r\n { defaultSelection: props.defaultSelection },\r\n )\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAIR,UAAA,EAAE,WAAW;AAEnB,cAAU,MAAM;AAEd,eAAS,MAAM;AACN,eAAA;AAAA,UACL,MAAM;AAKJ,kBAAM,gBAAgB,SAAS;AACzB,kBAAA,cAAc,OAAO;AAEzB,gBAAA,gBAAgB,SACZ,kBAAkB,QAAQ,CAAC,YAAY,SAAS,aAAa,IACjE;AAEA,0BAAY,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,QAAA;AAAA,MAC7C,CACD;AAAA,IAAA,CACF;;;;;;"}
1
+ {"version":3,"file":"AutoFocusPlugin.vue.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/AutoFocusPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { nextTick, onMounted } from 'vue'\r\nimport { useLexicalEditorContext } from '../composables'\r\n\r\nconst props = defineProps<{\r\n defaultSelection?: 'rootStart' | 'rootEnd'\r\n}>()\r\n\r\nconst { editor } = useLexicalEditorContext();\r\n\r\nonMounted(() => {\r\n\r\n nextTick(() => {\r\n editor.focus(() => {\r\n // If we try and move selection to the same point with setBaseAndExtent, it won't\r\n // trigger a re-focus on the element. So in the case this occurs, we'll need to correct it.\r\n // Normally this is fine, Selection API !== Focus API, but fore the intents of the naming\r\n // of this plugin, which should preserve focus too.\r\n const activeElement = document.activeElement\r\n const rootElement = editor.getRootElement() as HTMLDivElement\r\n if (\r\n rootElement !== null\r\n && (activeElement === null || !rootElement.contains(activeElement))\r\n ) {\r\n // Note: preventScroll won't work in Webkit.\r\n rootElement.focus({ preventScroll: true })\r\n }\r\n },\r\n { defaultSelection: props.defaultSelection },\r\n )\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAIR,UAAA,EAAE,WAAW;AAEnB,cAAU,MAAM;AAEd,eAAS,MAAM;AACN,eAAA;AAAA,UAAM,MAAM;AAKf,kBAAM,gBAAgB,SAAS;AACzB,kBAAA,cAAc,OAAO;AAEzB,gBAAA,gBAAgB,SACZ,kBAAkB,QAAQ,CAAC,YAAY,SAAS,aAAa,IACjE;AAEA,0BAAY,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,QAAA;AAAA,MAC7C,CACD;AAAA,IAAA,CACF;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./NodeTreeViewPlugin.vue3.js";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const NodeTreeViewPlugin = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-873c3ba2"]]);
4
+ const NodeTreeViewPlugin = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-315b8c39"]]);
5
5
  export {
6
6
  NodeTreeViewPlugin as default
7
7
  };
@@ -31,7 +31,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
31
31
  key: node.getKey(),
32
32
  name: name.toUpperCase(),
33
33
  desc: node.getDesc ? node.getDesc() : void 0,
34
- disabled: $isTextNode(node)
34
+ disabled: $isTextNode(node) || $isParagraphNode(node) && node.getChildrenSize() <= 0
35
35
  });
36
36
  if (node.getParent()) {
37
37
  list = list.concat(createNodeTree(node.getParent()));
@@ -1 +1 @@
1
- {"version":3,"file":"NodeTreeViewPlugin.vue3.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport {\r\n $getSelection,$isRangeSelection,$isNodeSelection, NodeKey,$isParagraphNode,\r\n$isRootNode,\r\n$isTextNode\r\n} from 'lexical'\r\nimport { $isHeadingNode } from '@lexical/rich-text'\r\nimport { useLexicalEditorContext, useMounted,setElementBlockSelection } from '../composables'\r\nimport { ref } from 'vue'\r\nimport { ArrowRightBold } from \"@element-plus/icons-vue\"\r\n\r\nconst { editor } = useLexicalEditorContext()\r\n\r\nconst selectNodeTreeList = ref<Array<{ key:string|NodeKey,name:string,desc?:string,disabled:boolean }>>([{name:\"ROOT\",key:\"root\",disabled:true}]);\r\n\r\nconst createNodeTree = (node?:any)=>{\r\n\r\n let list:any = [];\r\n\r\n if(node){\r\n\r\n let name:string = $isParagraphNode(node) ? \"P\" : (node.getName ? node.getName() : node.getType());\r\n\r\n // 标题\r\n if($isHeadingNode(node)){ name = `${node.getTag()}` }\r\n\r\n list.push({ \r\n key:node.getKey(),\r\n name:name.toUpperCase(),\r\n desc:node.getDesc ? node.getDesc() : undefined,\r\n disabled:$isTextNode(node)\r\n })\r\n\r\n if(node.getParent()){\r\n list = list.concat(createNodeTree(node.getParent()))\r\n }\r\n }\r\n\r\n return list;\r\n}\r\n\r\nuseMounted(() => {\r\n\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n\r\n editorState.read(()=>{\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n selectNodeTreeList.value = createNodeTree(selection.anchor.getNode()).reverse();\r\n }\r\n else if($isNodeSelection(selection)){\r\n selectNodeTreeList.value = createNodeTree(selection.getNodes()[0]).reverse();\r\n }\r\n })\r\n \r\n })\r\n})\r\n\r\n \r\n</script>\r\n\r\n<template>\r\n <div class=\"lexical-editor-node-tree\">\r\n <template v-for=\"item in selectNodeTreeList\" :key=\"item.key\">\r\n <div class=\"item\">\r\n <el-tooltip effect=\"dark\" :content=\"item.desc\" :disabled=\"!item.desc\" placement=\"top\">\r\n <el-button class=\"text\" text :nodeKey=\"item.key\" :disabled=\"item.disabled\" @click=\"setElementBlockSelection(editor,item.key)\">\r\n {{item.name}}\r\n <el-icon class=\"el-icon--right\"><ArrowRightBold /></el-icon>\r\n </el-button>\r\n </el-tooltip>\r\n </div>\r\n </template>\r\n </div>\r\n</template>\r\n<style lang=\"scss\" scoped>\r\n.lexical-editor-node-tree{\r\n display: flex;\r\n align-items: center;\r\n min-height: 30px;\r\n >.item{\r\n display: flex;\r\n align-items: center;\r\n font-size: 14px;\r\n .text{\r\n padding: 5px 5px 5px 7px;\r\n display: flex;\r\n align-items: center;\r\n }\r\n &:last-child .el-icon--right{\r\n display: none;\r\n }\r\n }\r\n}\r\n</style>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAYM,UAAA,EAAE,WAAW;AAEb,UAAA,qBAAqB,IAA6E,CAAC,EAAC,MAAK,QAAO,KAAI,QAAO,UAAS,KAAI,CAAC,CAAC;AAE1I,UAAA,iBAAiB,CAAC,SAAY;AAEhC,UAAI,OAAW,CAAA;AAEf,UAAG,MAAK;AAEA,YAAA,OAAc,iBAAiB,IAAI,IAAI,MAAO,KAAK,UAAU,KAAK,QAAA,IAAY,KAAK,QAAQ;AAG5F,YAAA,eAAe,IAAI,GAAE;AAAS,iBAAA,GAAG,KAAK,OAAA,CAAQ;AAAA,QAAG;AAEpD,aAAK,KAAK;AAAA,UACN,KAAI,KAAK,OAAO;AAAA,UAChB,MAAK,KAAK,YAAY;AAAA,UACtB,MAAK,KAAK,UAAU,KAAK,YAAY;AAAA,UACrC,UAAS,YAAY,IAAI;AAAA,QAAA,CAC5B;AAEE,YAAA,KAAK,aAAY;AAChB,iBAAO,KAAK,OAAO,eAAe,KAAK,UAAW,CAAA,CAAC;AAAA,QACvD;AAAA,MACJ;AAEO,aAAA;AAAA,IAAA;AAGX,eAAW,MAAM;AAEb,aAAO,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AAEtD,oBAAY,KAAK,MAAI;AAEjB,gBAAM,YAAY;AAEd,cAAA,kBAAkB,SAAS,GAAG;AAC9B,+BAAmB,QAAQ,eAAe,UAAU,OAAO,QAAS,CAAA,EAAE;UAAQ,WAE1E,iBAAiB,SAAS,GAAE;AACb,+BAAA,QAAQ,eAAe,UAAU,SAAA,EAAW,CAAC,CAAC,EAAE;UACvE;AAAA,QAAA,CACH;AAAA,MAAA,CAEJ;AAAA,IAAA,CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"NodeTreeViewPlugin.vue3.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/NodeTreeViewPlugin.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport {\r\n $getSelection,$isRangeSelection,$isNodeSelection, NodeKey,$isParagraphNode,\r\n $isRootNode,$isTextNode\r\n} from 'lexical'\r\nimport { $isHeadingNode } from '@lexical/rich-text'\r\nimport { useLexicalEditorContext, useMounted,setElementBlockSelection } from '../composables'\r\nimport { ref } from 'vue'\r\nimport { ArrowRightBold } from \"@element-plus/icons-vue\"\r\n\r\nconst { editor } = useLexicalEditorContext()\r\n\r\nconst selectNodeTreeList = ref<Array<{ key:string|NodeKey,name:string,desc?:string,disabled:boolean }>>([{name:\"ROOT\",key:\"root\",disabled:true}]);\r\n\r\nconst createNodeTree = (node?:any)=>{\r\n\r\n let list:any = [];\r\n\r\n if(node){\r\n\r\n let name:string = $isParagraphNode(node) ? \"P\" : (node.getName ? node.getName() : node.getType());\r\n\r\n // 标题\r\n if($isHeadingNode(node)){ name = `${node.getTag()}` }\r\n\r\n list.push({ \r\n key:node.getKey(),\r\n name:name.toUpperCase(),\r\n desc:node.getDesc ? node.getDesc() : undefined,\r\n disabled:$isTextNode(node) || ($isParagraphNode(node) && node.getChildrenSize() <= 0)\r\n })\r\n\r\n if(node.getParent()){\r\n list = list.concat(createNodeTree(node.getParent()))\r\n }\r\n }\r\n\r\n return list;\r\n}\r\n\r\nuseMounted(() => {\r\n\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n\r\n editorState.read(()=>{\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n selectNodeTreeList.value = createNodeTree(selection.anchor.getNode()).reverse();\r\n }\r\n else if($isNodeSelection(selection)){\r\n selectNodeTreeList.value = createNodeTree(selection.getNodes()[0]).reverse();\r\n }\r\n })\r\n \r\n })\r\n})\r\n\r\n \r\n</script>\r\n\r\n<template>\r\n <div class=\"lexical-editor-node-tree\">\r\n <template v-for=\"item in selectNodeTreeList\" :key=\"item.key\">\r\n <div class=\"item\">\r\n <el-tooltip effect=\"dark\" :content=\"item.desc\" :disabled=\"!item.desc\" placement=\"top\">\r\n <el-button class=\"text\" text :nodeKey=\"item.key\" :disabled=\"item.disabled\" @click=\"setElementBlockSelection(editor,item.key)\">\r\n {{item.name}}\r\n <el-icon class=\"el-icon--right\"><ArrowRightBold /></el-icon>\r\n </el-button>\r\n </el-tooltip>\r\n </div>\r\n </template>\r\n </div>\r\n</template>\r\n<style lang=\"scss\" scoped>\r\n.lexical-editor-node-tree{\r\n display: flex;\r\n align-items: center;\r\n min-height: 30px;\r\n >.item{\r\n display: flex;\r\n align-items: center;\r\n font-size: 14px;\r\n .text{\r\n padding: 5px 5px 5px 7px;\r\n display: flex;\r\n align-items: center;\r\n }\r\n &:last-child .el-icon--right{\r\n display: none;\r\n }\r\n }\r\n}\r\n</style>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAWM,UAAA,EAAE,WAAW;AAEb,UAAA,qBAAqB,IAA6E,CAAC,EAAC,MAAK,QAAO,KAAI,QAAO,UAAS,KAAI,CAAC,CAAC;AAE1I,UAAA,iBAAiB,CAAC,SAAY;AAEhC,UAAI,OAAW,CAAA;AAEf,UAAG,MAAK;AAEA,YAAA,OAAc,iBAAiB,IAAI,IAAI,MAAO,KAAK,UAAU,KAAK,QAAA,IAAY,KAAK,QAAQ;AAG5F,YAAA,eAAe,IAAI,GAAE;AAAS,iBAAA,GAAG,KAAK,OAAA,CAAQ;AAAA,QAAG;AAEpD,aAAK,KAAK;AAAA,UACN,KAAI,KAAK,OAAO;AAAA,UAChB,MAAK,KAAK,YAAY;AAAA,UACtB,MAAK,KAAK,UAAU,KAAK,YAAY;AAAA,UACrC,UAAS,YAAY,IAAI,KAAM,iBAAiB,IAAI,KAAK,KAAK,gBAAA,KAAqB;AAAA,QAAA,CACtF;AAEE,YAAA,KAAK,aAAY;AAChB,iBAAO,KAAK,OAAO,eAAe,KAAK,UAAW,CAAA,CAAC;AAAA,QACvD;AAAA,MACJ;AAEO,aAAA;AAAA,IAAA;AAGX,eAAW,MAAM;AAEb,aAAO,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AAEtD,oBAAY,KAAK,MAAI;AAEjB,gBAAM,YAAY;AAEd,cAAA,kBAAkB,SAAS,GAAG;AAC9B,+BAAmB,QAAQ,eAAe,UAAU,OAAO,QAAS,CAAA,EAAE;UAAQ,WAE1E,iBAAiB,SAAS,GAAE;AACb,+BAAA,QAAQ,eAAe,UAAU,SAAA,EAAW,CAAC,CAAC,EAAE;UACvE;AAAA,QAAA,CACH;AAAA,MAAA,CAEJ;AAAA,IAAA,CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { $isElementNode, $isRootNode, $getNodeByKey, $isParagraphNode, COMMAND_PRIORITY_LOW, $getSelection, $isNodeSelection, $getRoot, $createParagraphNode } from "lexical";
1
+ import { $isElementNode, $isRootNode, $getNodeByKey, $isParagraphNode, COMMAND_PRIORITY_LOW, $getSelection, $isNodeSelection, $isRangeSelection, $getRoot, $createParagraphNode } from "lexical";
2
2
  import { HeadingNode, QuoteNode, DRAG_DROP_PASTE } from "@lexical/rich-text";
3
3
  import { CodeHighlightNode, CodeNode } from "@lexical/code";
4
4
  import { AutoLinkNode, LinkNode, $isLinkNode, TOGGLE_LINK_COMMAND, $toggleLink } from "@lexical/link";
@@ -59,20 +59,22 @@ const insertNodeHandle = (node, selectNode) => {
59
59
  moduleWarp.append(node);
60
60
  node = moduleWarp;
61
61
  }
62
- if ($isRootNode(selectNode) && $isImageNode(node)) {
62
+ if ($isImageNode(node)) {
63
63
  const p = $createParagraphNode();
64
64
  p.append(node);
65
65
  node = p;
66
66
  }
67
67
  if ($isElementNode(selectNode) && !$isParagraphNode(selectNode)) {
68
68
  selectNode.append(node);
69
+ } else if ($isParagraphNode(selectNode)) {
70
+ selectNode.replace(node);
69
71
  } else {
70
72
  $insertNodeToNearestRoot(node);
71
73
  }
72
74
  };
73
75
  const insertNodesHandle = (...nodes) => {
74
76
  const selection = $getSelection();
75
- let selectNode = $isNodeSelection(selection) ? selection == null ? void 0 : selection.getNodes()[0] : $getRoot();
77
+ let selectNode = $isNodeSelection(selection) ? selection == null ? void 0 : selection.getNodes()[0] : $isRangeSelection(selection) ? selection.anchor.getNode() : $getRoot();
76
78
  nodes.forEach((node) => insertNodeHandle(node, selectNode));
77
79
  return false;
78
80
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditorPlugin.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/RichTextEditorPlugin.ts"],"sourcesContent":["\r\n\r\nimport { $createParagraphNode, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isNodeSelection, $isParagraphNode, $isRootNode, COMMAND_PRIORITY_LOW, LexicalNode, NodeKey } from \"lexical\";\r\n\r\nimport { DRAG_DROP_PASTE, HeadingNode, QuoteNode } from '@lexical/rich-text'\r\nimport { CodeHighlightNode, CodeNode } from '@lexical/code'\r\nimport { $isLinkNode, $toggleLink, AutoLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link'\r\nimport { registerEditorPlugin, useLexicalEditorContext } from \"../composables\"\r\nimport { \r\n HtmlElementDecoratorNode,getModuleData,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode,\r\n $isImageNode,\r\n $isImageTextWarpNode,\r\n INSERT_IMAGETEXTWARP_COMMAND,\r\n $createImageTextWarpNode,\r\n INSERT_IMAGE_COMMAND,\r\n $createImageNode,\r\n INSERT_MODULE_COMMAND,\r\n ModulePropType,\r\n createModuleHtml,\r\n $isModuleDecoratorNode,\r\n $isModuleDecoratorWarpNode,\r\n INSERT_TEMPLATE_COMMAND,\r\n INSERT_HTMLTEMPLATE_COMMAND\r\n } from \"../nodes\"\r\nimport { $insertNodeToNearestRoot, isMimeType, mediaFileReader, mergeRegister } from \"@lexical/utils\";\r\nimport { generateNodesFromHtml, getCSSFromStyleObject, imageUpload, sanitizeUrl, showHtmlTemplateDialog, showImageEditDialog, showLinkEditDialog, showModuleSelectDialog, showTemplateSelectDialog } from \"../utils\";\r\nimport { ElLoading } from \"element-plus\";\r\nimport { createDefaultFormData, showDynamicFormDialoger } from \"../../dynamic-form-panel\"; \r\n\r\n// 上传处理函数\r\nconst uploadhandle = async (pathList: Array<string>) => {\r\n\r\n if (pathList.length) {\r\n\r\n const loadingInstance = ElLoading.service({ fullscreen: true, text: \"图片上传中...\" })\r\n\r\n const reesult = await Promise.all(pathList.map(path => imageUpload(path)))\r\n\r\n loadingInstance.close();\r\n\r\n return reesult;\r\n }\r\n\r\n return [];\r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodeHandle = (node: LexicalNode,selectNode:LexicalNode) => {\r\n\r\n // 模块\r\n if ($isModuleDecoratorNode(node) && !$isModuleDecoratorWarpNode(node)) {\r\n const moduleWarp = new ModuleDecoratorWarpNode();\r\n moduleWarp.append(node);\r\n node = moduleWarp;\r\n }\r\n\r\n // 图片\r\n if($isRootNode(selectNode) && $isImageNode(node)){\r\n const p = $createParagraphNode();\r\n p.append(node)\r\n node = p;\r\n }\r\n\r\n if ($isElementNode(selectNode) && !$isParagraphNode(selectNode)) {\r\n\r\n selectNode.append(node);\r\n } \r\n else{\r\n \r\n $insertNodeToNearestRoot(node);\r\n }\r\n \r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodesHandle = (...nodes: Array<LexicalNode>) => {\r\n\r\n const selection = $getSelection()\r\n let selectNode = $isNodeSelection(selection) ? selection?.getNodes()[0] : $getRoot();\r\n\r\n nodes.forEach(node=> insertNodeHandle(node,selectNode))\r\n\r\n return false;\r\n}\r\n\r\n// 注册插件\r\nregisterEditorPlugin({\r\n nodes:[\r\n AutoLinkNode, LinkNode,\r\n CodeHighlightNode, CodeNode ,\r\n HeadingNode, QuoteNode ,\r\n HtmlElementDecoratorNode,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode\r\n ],\r\n tools:[\r\n {\r\n icon: \"Picture\",\r\n text: \"图片\",\r\n action:(editor)=>{\r\n // 显示图片编辑面板\r\n showImageEditDialog({\r\n src: \"\", alt: \"\", width: \"\", height: \"\", maxWidth: \"100%\", maxHeight: \"\", margin: \"\"\r\n }).then(async (data: any) => {\r\n const result = await uploadhandle([data.src])\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { \r\n src:result[0] as string,\r\n alt:data.alt,\r\n style:getCSSFromStyleObject({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\"margin\":data.margin\r\n }) \r\n })\r\n });\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"Grid\",\r\n text: \"模块\",\r\n action:async (editor)=>{\r\n // 打开模块面板\r\n const result = (await showModuleSelectDialog(editor._config.namespace)) as any;\r\n const defaultData = createDefaultFormData(result.options);\r\n editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"richtext\",\r\n text:\"模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_TEMPLATE_COMMAND,await showTemplateSelectDialog(editor._config.namespace))\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"richtext-outline\",\r\n text: \"图文环绕\",\r\n action:(editor)=>{\r\n editor.dispatchCommand(INSERT_IMAGETEXTWARP_COMMAND,null)\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"html-code\",\r\n text:\"HTML模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_HTMLTEMPLATE_COMMAND,await showHtmlTemplateDialog())\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:89\r\n }\r\n ],\r\n shortcutTools:editor=>{\r\n\r\n const { findLexicalEditorModule } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n return [\r\n // 默认编辑\r\n // {\r\n // exist:(node)=>$isHtmlElementNode(node) || $isHtmlElementDecoratorNode(node),\r\n // tools:[\r\n // {\r\n // key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LexicalNode) => {\r\n // console.log(\"编辑\")\r\n // // // 打开模块面板\r\n // // const result = (await showModuleSelectDialog()) as ModuleType;\r\n // // const defaultData = createDefaultFormData(result.options);\r\n // // // 插入模块\r\n // // editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n // }\r\n // }\r\n // ]\r\n // },\r\n // 超链接\r\n {\r\n exist:(node)=>$isLinkNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LinkNode) => {\r\n \r\n // 显示图片编辑面板\r\n showLinkEditDialog(editor.read(()=>editNode.getURL())).then((href:any)=>{\r\n if(href.trim()){\r\n editor.update(()=>{\r\n editNode.getWritable().setURL(sanitizeUrl(href))\r\n })\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n })\r\n \r\n }\r\n }\r\n ]\r\n },\r\n // 模块\r\n {\r\n exist:(node)=>$isModuleDecoratorNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ModuleDecoratorNode) => {\r\n const module = findLexicalEditorModule(editNode.__moduleName);\r\n if(module){\r\n const result = await showDynamicFormDialoger(module.title,module.options,getModuleData(editNode.__moduleHtml,module.options))\r\n editor.update(() => editNode.setHtml(createModuleHtml(module.template,result)))\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n // 图片编辑\r\n {\r\n exist:(node)=>$isImageNode(node),\r\n tools:(nodeKey) => {\r\n \r\n const node = $getNodeByKey(nodeKey as NodeKey);\r\n \r\n if ($isImageNode(node)) {\r\n \r\n const parent = node.getParent();\r\n \r\n // 是否是文本环绕里面的图\r\n const isImageTextWarp = $isImageTextWarpNode(parent)\r\n \r\n // 工具条\r\n const toolbarList:Array<any> = [\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ImageNode) => {\r\n \r\n const {src,alt,style} = { style:editNode.getStyleObj(),src:editNode.__src,alt:editNode.__alt }\r\n \r\n const data: any = await showImageEditDialog({\r\n src, alt, \r\n width: style.width || \"\", height: style.height || \"\", \r\n maxWidth: style[\"max-width\"] || \"\", maxHeight: style[\"max-height\"] || \"\",\r\n margin: style.margin || \"\"\r\n }) \r\n \r\n const result = await uploadhandle([data.src])\r\n \r\n editor.update(()=>{\r\n\r\n node.setSrc(result[0] as string)\r\n node.setAlt(data.alt)\r\n node.addStyle({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\r\n \"margin\":data.margin\r\n })\r\n })\r\n }\r\n }\r\n ];\r\n \r\n // 左对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居左\" : \"左对齐\",icon:`doc-align-left`,action:async (editNode:ImageNode)=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n editNode.addStyle({ 'float':\"left\" })\r\n }\r\n else {\r\n parent.setFormat(\"left\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n // 居中对齐\r\n if($isParagraphNode(parent) && !isImageTextWarp){\r\n toolbarList.push({ title: \"居中对齐\",icon:`doc-align-center`,action:async ()=>{\r\n editor.update(()=>parent.setFormat(\"center\") )\r\n }\r\n });\r\n }\r\n \r\n // 右对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居右\" : \"右对齐\",icon:`doc-align-right`,action:async ()=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n node.addStyle({ 'float':\"right\" })\r\n }\r\n else {\r\n parent.setFormat(\"right\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n return toolbarList;\r\n }\r\n \r\n return null;\r\n }\r\n }\r\n ]\r\n },\r\n templates:[],\r\n useMounted(editor){\r\n \r\n const { findLexicalEditorModule,findLexicalEditorTemplate } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n \r\n // 注册指令\r\n return mergeRegister(\r\n // // 插入布局格子\r\n // editor.registerCommand<LayoutGridNodeAttrType>(INSERT_LAYOUTGRID_COMMAND, (payload) => {\r\n\r\n // insertGridHandle(new LayoutGridNode(payload));\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入文本格子\r\n // editor.registerCommand<TextGridNodeAttrType>(INSERT_TEXTGRID_COMMAND, (payload) => {\r\n\r\n // const textGrid = new TextGridNode(payload)\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // insertGridHandle(textGrid);\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入模块格子\r\n // editor.registerCommand<ModuleGridNodeAttrType>(INSERT_MODULEGRID_COMMAND, (payload) => {\r\n // insertGridHandle(new ModuleGridNode(payload));\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // 插入模块\r\n editor.registerCommand<ModulePropType>(INSERT_MODULE_COMMAND,(payload) => {\r\n\r\n const module = findLexicalEditorModule(payload.name)\r\n\r\n if(module){\r\n insertNodesHandle(new ModuleDecoratorNode(payload.name,createModuleHtml(module.template,payload.data)))\r\n }\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n // 插入图文环绕\r\n editor.registerCommand<null>(INSERT_IMAGETEXTWARP_COMMAND, () => insertNodesHandle($createImageTextWarpNode()), COMMAND_PRIORITY_LOW),\r\n // 插入图片\r\n editor.registerCommand(INSERT_IMAGE_COMMAND, (payload) => {\r\n return insertNodesHandle($createImageNode(payload.src,payload.alt,\"\",payload.style))\r\n }, COMMAND_PRIORITY_LOW),\r\n // 剪切板图片\r\n editor.registerCommand(DRAG_DROP_PASTE, (files) => {\r\n const types = [\r\n 'image/',\r\n 'image/heic',\r\n 'image/heif',\r\n 'image/gif',\r\n 'image/webp',\r\n ];\r\n\r\n (async () => {\r\n\r\n const filesResult = await mediaFileReader(files, [types].flatMap((x) => x))\r\n\r\n const result = await uploadhandle(filesResult.filter(f => isMimeType(f.file, types)).map(f => f.result))\r\n\r\n result.forEach((path) => {\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { src: path as string, alt: \"\", style:\"max-width:100%\"})\r\n })\r\n })()\r\n\r\n return true\r\n }, COMMAND_PRIORITY_LOW),\r\n // 插入模版\r\n editor.registerCommand<string>(INSERT_TEMPLATE_COMMAND,(name) => {\r\n\r\n const template = findLexicalEditorTemplate(name);\r\n \r\n const templateNodes = template ? generateNodesFromHtml(editor, template.template) : [];\r\n \r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n \r\n // 插入HTML模版\r\n editor.registerCommand<string>(INSERT_HTMLTEMPLATE_COMMAND,(html) => {\r\n\r\n const templateNodes = generateNodesFromHtml(editor, html);\r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n //链接\r\n editor.registerCommand(TOGGLE_LINK_COMMAND,(payload) => {\r\n if (payload === null) {\r\n $toggleLink(payload)\r\n return true\r\n }\r\n else if (typeof payload === 'string') {\r\n $toggleLink(payload)\r\n return false\r\n }\r\n else {\r\n const { url, target, rel, title } = payload\r\n $toggleLink(url, { rel, target, title })\r\n return true\r\n }\r\n }, COMMAND_PRIORITY_LOW)\r\n );\r\n }\r\n})\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RichTextEditorPlugin.js","sources":["../../../../../../src/components/basic/lexical-editor/plugins/RichTextEditorPlugin.ts"],"sourcesContent":["\r\n\r\nimport { $createParagraphNode, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isNodeSelection, $isParagraphNode, $isRangeSelection, $isRootNode, COMMAND_PRIORITY_LOW, LexicalNode, NodeKey } from \"lexical\";\r\n\r\nimport { DRAG_DROP_PASTE, HeadingNode, QuoteNode } from '@lexical/rich-text'\r\nimport { CodeHighlightNode, CodeNode } from '@lexical/code'\r\nimport { $isLinkNode, $toggleLink, AutoLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link'\r\nimport { registerEditorPlugin, useLexicalEditorContext } from \"../composables\"\r\nimport { \r\n HtmlElementDecoratorNode,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode,\r\n $isImageNode,\r\n $isImageTextWarpNode,\r\n INSERT_IMAGETEXTWARP_COMMAND,\r\n $createImageTextWarpNode,\r\n INSERT_IMAGE_COMMAND,\r\n $createImageNode,\r\n INSERT_MODULE_COMMAND,\r\n ModulePropType,\r\n createModuleHtml,getModuleData,\r\n $isModuleDecoratorNode,\r\n $isModuleDecoratorWarpNode,\r\n INSERT_HTMLTEMPLATE_COMMAND,\r\n INSERT_TEMPLATE_COMMAND\r\n } from \"../nodes\"\r\nimport { $insertNodeToNearestRoot, isMimeType, mediaFileReader, mergeRegister } from \"@lexical/utils\";\r\nimport { generateNodesFromHtml, getCSSFromStyleObject, imageUpload, sanitizeUrl, showHtmlTemplateDialog, showImageEditDialog, showLinkEditDialog, showModuleSelectDialog, showTemplateSelectDialog } from \"../utils\";\r\nimport { ElLoading } from \"element-plus\";\r\nimport { createDefaultFormData, showDynamicFormDialoger } from \"../../dynamic-form-panel\"; \r\n\r\n// 上传处理函数\r\nconst uploadhandle = async (pathList: Array<string>) => {\r\n\r\n if (pathList.length) {\r\n\r\n const loadingInstance = ElLoading.service({ fullscreen: true, text: \"图片上传中...\" })\r\n\r\n const reesult = await Promise.all(pathList.map(path => imageUpload(path)))\r\n\r\n loadingInstance.close();\r\n\r\n return reesult;\r\n }\r\n\r\n return [];\r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodeHandle = (node: LexicalNode,selectNode:LexicalNode) => {\r\n\r\n // 模块\r\n if ($isModuleDecoratorNode(node) && !$isModuleDecoratorWarpNode(node)) {\r\n const moduleWarp = new ModuleDecoratorWarpNode();\r\n moduleWarp.append(node);\r\n node = moduleWarp;\r\n }\r\n\r\n // 图片\r\n if($isImageNode(node)){\r\n const p = $createParagraphNode();\r\n p.append(node)\r\n node = p;\r\n }\r\n if ($isElementNode(selectNode) && !$isParagraphNode(selectNode)) {\r\n selectNode.append(node);\r\n } \r\n else if ($isParagraphNode(selectNode)) {\r\n selectNode.replace(node);\r\n } \r\n else{\r\n $insertNodeToNearestRoot(node);\r\n }\r\n \r\n}\r\n\r\n// 插入节点的处理函数\r\nconst insertNodesHandle = (...nodes: Array<LexicalNode>) => {\r\n\r\n const selection = $getSelection()\r\n let selectNode = $isNodeSelection(selection) ? selection?.getNodes()[0] : ($isRangeSelection(selection) ? selection.anchor.getNode() : $getRoot());\r\n\r\n nodes.forEach(node=> insertNodeHandle(node,selectNode))\r\n\r\n return false;\r\n}\r\n\r\n// 注册插件\r\nregisterEditorPlugin({\r\n nodes:[\r\n AutoLinkNode, LinkNode,\r\n CodeHighlightNode, CodeNode ,\r\n HeadingNode, QuoteNode ,\r\n HtmlElementDecoratorNode,\r\n ModuleDecoratorNode,ModuleDecoratorWarpNode,\r\n HtmlElementNode,\r\n ImageNode,ImageTextWarpNode\r\n ],\r\n tools:[\r\n {\r\n icon: \"Picture\",\r\n text: \"图片\",\r\n action:(editor)=>{\r\n // 显示图片编辑面板\r\n showImageEditDialog({\r\n src: \"\", alt: \"\", width: \"\", height: \"\", maxWidth: \"100%\", maxHeight: \"\", margin: \"\"\r\n }).then(async (data: any) => {\r\n const result = await uploadhandle([data.src])\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { \r\n src:result[0] as string,\r\n alt:data.alt,\r\n style:getCSSFromStyleObject({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\"margin\":data.margin\r\n }) \r\n })\r\n });\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"Grid\",\r\n text: \"模块\",\r\n action:async (editor)=>{\r\n // 打开模块面板\r\n const result = (await showModuleSelectDialog(editor._config.namespace)) as any;\r\n const defaultData = createDefaultFormData(result.options);\r\n editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"richtext\",\r\n text:\"模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_TEMPLATE_COMMAND,await showTemplateSelectDialog(editor._config.namespace))\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon: \"richtext-outline\",\r\n text: \"图文环绕\",\r\n action:(editor)=>{\r\n editor.dispatchCommand(INSERT_IMAGETEXTWARP_COMMAND,null)\r\n }, \r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:99\r\n },\r\n {\r\n icon:\"html-code\",\r\n text:\"HTML模版\",\r\n action:async (editor)=>{\r\n editor.dispatchCommand(INSERT_HTMLTEMPLATE_COMMAND,await showHtmlTemplateDialog())\r\n },\r\n disbale:(node)=>!$isElementNode(node) && !$isRootNode(node) || $isModuleDecoratorWarpNode(node),\r\n sort:89\r\n }\r\n ],\r\n shortcutTools:editor=>{\r\n\r\n const { findLexicalEditorModule } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n return [\r\n // 默认编辑\r\n // {\r\n // exist:(node)=>$isHtmlElementNode(node) || $isHtmlElementDecoratorNode(node),\r\n // tools:[\r\n // {\r\n // key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LexicalNode) => {\r\n // console.log(\"编辑\")\r\n // // // 打开模块面板\r\n // // const result = (await showModuleSelectDialog()) as ModuleType;\r\n // // const defaultData = createDefaultFormData(result.options);\r\n // // // 插入模块\r\n // // editor.dispatchCommand(INSERT_MODULE_COMMAND, { name: result.name, data: defaultData })\r\n // }\r\n // }\r\n // ]\r\n // },\r\n // 超链接\r\n {\r\n exist:(node)=>$isLinkNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:LinkNode) => {\r\n \r\n // 显示图片编辑面板\r\n showLinkEditDialog(editor.read(()=>editNode.getURL())).then((href:any)=>{\r\n if(href.trim()){\r\n editor.update(()=>{\r\n editNode.getWritable().setURL(sanitizeUrl(href))\r\n })\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n })\r\n \r\n }\r\n }\r\n ]\r\n },\r\n // 模块\r\n {\r\n exist:(node)=>$isModuleDecoratorNode(node),\r\n tools:[\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ModuleDecoratorNode) => {\r\n const module = findLexicalEditorModule(editNode.__moduleName);\r\n if(module){\r\n const result = await showDynamicFormDialoger(module.title,module.options,getModuleData(editNode.__moduleHtml,module.options))\r\n editor.update(() => editNode.setHtml(createModuleHtml(module.template,result)))\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n // 图片编辑\r\n {\r\n exist:(node)=>$isImageNode(node),\r\n tools:(nodeKey) => {\r\n \r\n const node = $getNodeByKey(nodeKey as NodeKey);\r\n \r\n if ($isImageNode(node)) {\r\n \r\n const parent = node.getParent();\r\n \r\n // 是否是文本环绕里面的图\r\n const isImageTextWarp = $isImageTextWarpNode(parent)\r\n \r\n // 工具条\r\n const toolbarList:Array<any> = [\r\n {\r\n key:\"edit\",title: \"编辑\", icon: \"Edit\", action: async (editNode:ImageNode) => {\r\n \r\n const {src,alt,style} = { style:editNode.getStyleObj(),src:editNode.__src,alt:editNode.__alt }\r\n \r\n const data: any = await showImageEditDialog({\r\n src, alt, \r\n width: style.width || \"\", height: style.height || \"\", \r\n maxWidth: style[\"max-width\"] || \"\", maxHeight: style[\"max-height\"] || \"\",\r\n margin: style.margin || \"\"\r\n }) \r\n \r\n const result = await uploadhandle([data.src])\r\n \r\n editor.update(()=>{\r\n\r\n node.setSrc(result[0] as string)\r\n node.setAlt(data.alt)\r\n node.addStyle({\r\n \"width\":data.width,\"height\":data.height,\r\n \"max-width\":data.maxWidth,\r\n \"max-height\":data.maxHeight,\r\n \"margin\":data.margin\r\n })\r\n })\r\n }\r\n }\r\n ];\r\n \r\n // 左对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居左\" : \"左对齐\",icon:`doc-align-left`,action:async (editNode:ImageNode)=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n editNode.addStyle({ 'float':\"left\" })\r\n }\r\n else {\r\n parent.setFormat(\"left\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n // 居中对齐\r\n if($isParagraphNode(parent) && !isImageTextWarp){\r\n toolbarList.push({ title: \"居中对齐\",icon:`doc-align-center`,action:async ()=>{\r\n editor.update(()=>parent.setFormat(\"center\") )\r\n }\r\n });\r\n }\r\n \r\n // 右对齐\r\n if($isParagraphNode(parent) || isImageTextWarp){\r\n toolbarList.push({ title: isImageTextWarp ? \"居右\" : \"右对齐\",icon:`doc-align-right`,action:async ()=>{\r\n editor.update(()=>{\r\n if(isImageTextWarp){\r\n node.addStyle({ 'float':\"right\" })\r\n }\r\n else {\r\n parent.setFormat(\"right\")\r\n }\r\n })\r\n }\r\n });\r\n }\r\n \r\n return toolbarList;\r\n }\r\n \r\n return null;\r\n }\r\n }\r\n ]\r\n },\r\n templates:[],\r\n useMounted(editor){\r\n \r\n const { findLexicalEditorModule,findLexicalEditorTemplate } = useLexicalEditorContext(editor._config.namespace)\r\n\r\n \r\n // 注册指令\r\n return mergeRegister(\r\n // // 插入布局格子\r\n // editor.registerCommand<LayoutGridNodeAttrType>(INSERT_LAYOUTGRID_COMMAND, (payload) => {\r\n\r\n // insertGridHandle(new LayoutGridNode(payload));\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入文本格子\r\n // editor.registerCommand<TextGridNodeAttrType>(INSERT_TEXTGRID_COMMAND, (payload) => {\r\n\r\n // const textGrid = new TextGridNode(payload)\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // textGrid.append($createParagraphNode())\r\n // insertGridHandle(textGrid);\r\n\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // // 插入模块格子\r\n // editor.registerCommand<ModuleGridNodeAttrType>(INSERT_MODULEGRID_COMMAND, (payload) => {\r\n // insertGridHandle(new ModuleGridNode(payload));\r\n // return true\r\n // }, COMMAND_PRIORITY_EDITOR),\r\n // 插入模块\r\n editor.registerCommand<ModulePropType>(INSERT_MODULE_COMMAND,(payload) => {\r\n\r\n const module = findLexicalEditorModule(payload.name)\r\n\r\n if(module){\r\n insertNodesHandle(new ModuleDecoratorNode(payload.name,createModuleHtml(module.template,payload.data)))\r\n }\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n // 插入图文环绕\r\n editor.registerCommand<null>(INSERT_IMAGETEXTWARP_COMMAND, () => insertNodesHandle($createImageTextWarpNode()), COMMAND_PRIORITY_LOW),\r\n // 插入图片\r\n editor.registerCommand(INSERT_IMAGE_COMMAND, (payload) => {\r\n return insertNodesHandle($createImageNode(payload.src,payload.alt,\"\",payload.style))\r\n }, COMMAND_PRIORITY_LOW),\r\n // 剪切板图片\r\n editor.registerCommand(DRAG_DROP_PASTE, (files) => {\r\n const types = [\r\n 'image/',\r\n 'image/heic',\r\n 'image/heif',\r\n 'image/gif',\r\n 'image/webp',\r\n ];\r\n\r\n (async () => {\r\n\r\n const filesResult = await mediaFileReader(files, [types].flatMap((x) => x))\r\n\r\n const result = await uploadhandle(filesResult.filter(f => isMimeType(f.file, types)).map(f => f.result))\r\n\r\n result.forEach((path) => {\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, { src: path as string, alt: \"\", style:\"max-width:100%\"})\r\n })\r\n })()\r\n\r\n return true\r\n }, COMMAND_PRIORITY_LOW),\r\n // 插入模版\r\n editor.registerCommand<string>(INSERT_TEMPLATE_COMMAND,(name) => {\r\n\r\n const template = findLexicalEditorTemplate(name);\r\n \r\n const templateNodes = template ? generateNodesFromHtml(editor, template.template) : [];\r\n \r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n \r\n // 插入HTML模版\r\n editor.registerCommand<string>(INSERT_HTMLTEMPLATE_COMMAND,(html) => {\r\n\r\n const templateNodes = generateNodesFromHtml(editor, html);\r\n insertNodesHandle(...templateNodes)\r\n \r\n return true\r\n },COMMAND_PRIORITY_LOW),\r\n //链接\r\n editor.registerCommand(TOGGLE_LINK_COMMAND,(payload) => {\r\n if (payload === null) {\r\n $toggleLink(payload)\r\n return true\r\n }\r\n else if (typeof payload === 'string') {\r\n $toggleLink(payload)\r\n return false\r\n }\r\n else {\r\n const { url, target, rel, title } = payload\r\n $toggleLink(url, { rel, target, title })\r\n return true\r\n }\r\n }, COMMAND_PRIORITY_LOW)\r\n );\r\n }\r\n})\r\n"],"names":[],"mappings":"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"}
@@ -1,19 +1,19 @@
1
- .lexical-editor-node-tree[data-v-873c3ba2] {
1
+ .lexical-editor-node-tree[data-v-315b8c39] {
2
2
  display: flex;
3
3
  align-items: center;
4
4
  min-height: 30px;
5
5
  }
6
- .lexical-editor-node-tree > .item[data-v-873c3ba2] {
6
+ .lexical-editor-node-tree > .item[data-v-315b8c39] {
7
7
  display: flex;
8
8
  align-items: center;
9
9
  font-size: 14px;
10
10
  }
11
- .lexical-editor-node-tree > .item .text[data-v-873c3ba2] {
11
+ .lexical-editor-node-tree > .item .text[data-v-315b8c39] {
12
12
  padding: 5px 5px 5px 7px;
13
13
  display: flex;
14
14
  align-items: center;
15
15
  }
16
- .lexical-editor-node-tree > .item:last-child .el-icon--right[data-v-873c3ba2] {
16
+ .lexical-editor-node-tree > .item:last-child .el-icon--right[data-v-315b8c39] {
17
17
  display: none;
18
18
  }.mk-doc-editor-shortcut-tools-warp[data-v-6efcbbca] {
19
19
  position: absolute;
@@ -65,7 +65,11 @@ export declare class ImageNode extends HtmlElementDecoratorNode {
65
65
  * @param _config
66
66
  * @returns
67
67
  */
68
- updateDOM(prevNode: LexicalNode, dom: HTMLElement, config: EditorConfig): boolean;
68
+ updateDOM(prevNode: ImageNode, dom: HTMLElement, config: EditorConfig): boolean;
69
+ /**
70
+ * @returns
71
+ */
72
+ isInline(): boolean;
69
73
  }
70
74
  /**
71
75
  * 创建图片节点
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maketribe/ms-app",
3
- "version": "3.2.43",
3
+ "version": "3.2.44",
4
4
  "description": "",
5
5
  "main": "dist/cjs",
6
6
  "module": "dist/esm",
@@ -50,9 +50,9 @@
50
50
  "vue-codemirror": "^6.1.1",
51
51
  "vue-cropper": "^1.1.4",
52
52
  "vue-router": "^4.2.4",
53
- "@maketribe/request": "^3.2.4",
54
53
  "@maketribe/dm": "^3.2.12",
55
54
  "@maketribe/utils": "^3.2.1",
55
+ "@maketribe/request": "^3.2.4",
56
56
  "@maketribe/locale": "^3.2.0"
57
57
  },
58
58
  "devDependencies": {