@maketribe/ms-app 3.2.45 → 3.2.46
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.
- package/dist/cjs/components/basic/lexical-editor/assets/doc-editor.css.js +1 -1
- package/dist/cjs/components/basic/lexical-editor/assets/doc-editor.css.js.map +1 -1
- package/dist/cjs/components/basic/lexical-editor/utils/html.js +1 -19
- package/dist/cjs/components/basic/lexical-editor/utils/html.js.map +1 -1
- package/dist/cjs/components/basic/lexical-editor/utils/module.js.map +1 -1
- package/dist/cjs/modules/cms/cms-settings.js +5 -1
- package/dist/cjs/modules/cms/cms-settings.js.map +1 -1
- package/dist/cjs/modules/cms/pages/cms-contents/components/part-banner-edit.vue.js +40 -324
- package/dist/cjs/modules/cms/pages/cms-contents/components/part-banner-edit.vue.js.map +1 -1
- package/dist/cjs/modules/cms/pages/cms-contents/components/part-banner.vue.js +362 -0
- package/dist/cjs/modules/cms/pages/cms-contents/components/part-banner.vue.js.map +1 -0
- package/dist/cjs/modules/cms/pages/cms-contents/components/part-banner.vue2.js +4 -0
- package/dist/cjs/modules/cms/pages/cms-contents/components/part-banner.vue2.js.map +1 -0
- package/dist/cjs/modules/cms/pages/cms-settigns/index.vue2.js +38 -15
- package/dist/cjs/modules/cms/pages/cms-settigns/index.vue2.js.map +1 -1
- package/dist/esm/components/basic/lexical-editor/assets/doc-editor.css.js +1 -1
- package/dist/esm/components/basic/lexical-editor/assets/doc-editor.css.js.map +1 -1
- package/dist/esm/components/basic/lexical-editor/utils/html.js +2 -20
- package/dist/esm/components/basic/lexical-editor/utils/html.js.map +1 -1
- package/dist/esm/components/basic/lexical-editor/utils/module.js.map +1 -1
- package/dist/esm/modules/cms/cms-settings.js +5 -1
- package/dist/esm/modules/cms/cms-settings.js.map +1 -1
- package/dist/esm/modules/cms/pages/cms-contents/components/part-banner-edit.vue.js +41 -325
- package/dist/esm/modules/cms/pages/cms-contents/components/part-banner-edit.vue.js.map +1 -1
- package/dist/esm/modules/cms/pages/cms-contents/components/part-banner.vue.js +363 -0
- package/dist/esm/modules/cms/pages/cms-contents/components/part-banner.vue.js.map +1 -0
- package/dist/esm/modules/cms/pages/cms-contents/components/part-banner.vue2.js +5 -0
- package/dist/esm/modules/cms/pages/cms-contents/components/part-banner.vue2.js.map +1 -0
- package/dist/esm/modules/cms/pages/cms-settigns/index.vue2.js +38 -15
- package/dist/esm/modules/cms/pages/cms-settigns/index.vue2.js.map +1 -1
- package/dist/style/index.css +1 -1
- package/dist/style/modules/cms/index.css +1 -1
- package/dist/style/modules/cms/pages/cms-contents/components/mk-cms-part-banner.css +1 -1
- package/dist/style/modules/cms/pages/cms-contents/index.css +1 -1
- package/dist/style/src/modules/cms/pages/cms-contents/components/mk-cms-part-banner.scss +1 -0
- package/dist/types/modules/cms/cms-settings.d.ts +5 -1
- package/dist/types/modules/cms/pages/cms-contents/components/part-banner.vue.d.ts +32 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue2.js","sources":["../../../../../../src/modules/cms/pages/cms-settigns/index.vue"],"sourcesContent":["<template>\r\n <div class=\"mk-cms-appsettings__warp\" v-loading=\"loading\" style=\"\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n\">\r\n <el-page-header style=\"background-color: #fff; padding: 10px\" :icon=\"null\">\r\n <template #title>\r\n <h3 style=\"color: var(--el-text-color-regular); margin-left: 10px\">\r\n <MKSvgIcon iconClass=\"Operation\" style=\"margin-right: 5px\" />\r\n CMS应用设置\r\n </h3>\r\n </template>\r\n <template #extra>\r\n <div>\r\n <el-button-group>\r\n <el-button type=\"primary\" size=\"large\" text :disabled=\"!changed\" @click=\"saveHandle\">\r\n <MKSvgIcon iconClass=\"save\" />\r\n 保存\r\n </el-button>\r\n </el-button-group>\r\n </div>\r\n </template>\r\n </el-page-header>\r\n <div class=\"mk-cms-appsettings__form_warp\" style=\"\r\n background: #fff;\r\n flex: 1;\r\n height: 100%;\r\n padding: 10px;\r\n margin: 10px;\r\n overflow: auto;\r\n \">\r\n <el-tabs v-model=\"activeTabName\" class=\"mk-cms-contents__body__right\">\r\n <el-tab-pane label=\"发布设置\" name=\"publish\">\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\">\r\n <el-form-item label=\"发布模式 : \">\r\n <el-radio-group v-model=\"CmsSettings.publish.mode\">\r\n <el-radio value=\"static\">静态发布</el-radio>\r\n <el-radio value=\"dynamic\">动态发布</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-form>\r\n <!-- <el-form :model=\"CmsSettings\" label-width=\"auto\" label-position=\"top\">\r\n <el-form-item label=\"文档模块 : \">\r\n <DocModuleEditForm :modules=\"CmsSettings.docModules\"></DocModuleEditForm>\r\n </el-form-item>\r\n </el-form> -->\r\n </el-tab-pane>\r\n <el-tab-pane label=\"栏目设置\" name=\"part\">\r\n <el-divider content-position=\"left\">栏目内容文档编辑器扩展设置</el-divider>\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\">\r\n <el-form-item label=\"开启栏目轮播图 : \">\r\n <el-switch v-model=\"CmsSettings.part.openBanner\" />\r\n </el-form-item>\r\n\r\n <el-form-item v-if=\"CmsSettings.part.openBanner\" label=\"轮播图尺寸 : \">\r\n <el-input v-model=\"CmsSettings.part.bannerImageSize\" placeholder=\"\" style=\"max-width: 200px;\" />\r\n </el-form-item>\r\n </el-form>\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\" label-position=\"top\">\r\n \r\n <el-form-item label=\"引入的Css : \">\r\n <el-input v-model=\"CmsSettings.part.doc.css\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个css url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n \r\n <el-form-item label=\"引入的Js : \">\r\n <el-input v-model=\"CmsSettings.part.doc.js\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个 js url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n </el-form>\r\n </el-tab-pane>\r\n <el-tab-pane label=\"内容设置\" name=\"content\">\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\">\r\n <el-form-item label=\"启用内容置顶 : \">\r\n <el-switch v-model=\"CmsSettings.content.useTop\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用最新内容 : \">\r\n <el-switch v-model=\"CmsSettings.content.useNew\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用热门推荐 : \">\r\n <el-switch v-model=\"CmsSettings.content.useHotRecommend\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用栏目推荐 : \">\r\n <el-switch v-model=\"CmsSettings.content.usePartRecommend\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用内容标签 : \">\r\n <el-switch v-model=\"CmsSettings.content.useTags\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用内容资源库 : \">\r\n <el-switch v-model=\"CmsSettings.content.useAtlas\" />\r\n </el-form-item>\r\n <el-form-item label=\"内容封面图尺寸 : \">\r\n <el-input v-model=\"CmsSettings.content.coverImageSize\" placeholder=\"\" style=\"max-width: 200px;\" />\r\n </el-form-item>\r\n <el-form-item label=\"内容Banner图尺寸 : \">\r\n <el-input v-model=\"CmsSettings.content.bannerImageSize\" placeholder=\"\" style=\"max-width: 200px;\" />\r\n </el-form-item>\r\n </el-form>\r\n \r\n <el-divider content-position=\"left\">内容文档编辑器扩展设置</el-divider>\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\" label-position=\"top\">\r\n <el-form-item label=\"引入的Css : \">\r\n <el-input v-model=\"CmsSettings.content.doc.css\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个css url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n \r\n <el-form-item label=\"引入的Js : \">\r\n <el-input v-model=\"CmsSettings.content.doc.js\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个 js url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n </el-form>\r\n </el-tab-pane>\r\n </el-tabs>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref,onMounted,watch, } from \"vue\";\r\nimport { useCmsSettings,CmsSettingsKEY,type CmsSettingsType } from \"../../cms-settings\"\r\nimport { MsConfigTable } from \"../../../ms/dataviews/ms-config/\"\r\nimport DocModuleEditForm from \"./DocModuleEditForm.vue\"\r\n\r\n// cms 配置\r\nconst CmsSettings = useCmsSettings(true); \r\n\r\n// 激活的tab\r\nconst activeTabName = ref(\"publish\");\r\n// 激活的tab\r\nconst loading = ref(false);\r\nconst changed = ref(false);\r\n\r\n\r\nconst saveHandle = async ()=>{\r\n\r\n if(changed.value){\r\n loading.value = true;\r\n await MsConfigTable.setConfigValue(CmsSettingsKEY,JSON.stringify(CmsSettings))\r\n loading.value = false;\r\n changed.value = false;\r\n }\r\n\r\n}\r\n\r\nonMounted(async ()=>{\r\n\r\n // 初始化\r\n const data = await MsConfigTable.getConfigValue<CmsSettingsType>(CmsSettingsKEY);\r\n if(data){ Object.assign(CmsSettings,data) }\r\n setTimeout(() => {\r\n loading.value = false;\r\n }, 500);\r\n // 数据改变\r\n watch(CmsSettings,()=>{\r\n changed.value = true;\r\n },{ deep:true })\r\n})\r\n</script>\r\n"],"names":["useCmsSettings","ref","MsConfigTable","CmsSettingsKEY","onMounted","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.vue2.js","sources":["../../../../../../src/modules/cms/pages/cms-settigns/index.vue"],"sourcesContent":["<template>\r\n <div class=\"mk-cms-appsettings__warp\" v-loading=\"loading\" style=\"\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n\">\r\n <el-page-header style=\"background-color: #fff; padding: 10px\" :icon=\"null\">\r\n <template #title>\r\n <h3 style=\"color: var(--el-text-color-regular); margin-left: 10px\">\r\n <MKSvgIcon iconClass=\"Operation\" style=\"margin-right: 5px\" />\r\n CMS应用设置\r\n </h3>\r\n </template>\r\n <template #extra>\r\n <div>\r\n <el-button-group>\r\n <el-button type=\"primary\" size=\"large\" text :disabled=\"!changed\" @click=\"saveHandle\">\r\n <MKSvgIcon iconClass=\"save\" />\r\n 保存\r\n </el-button>\r\n </el-button-group>\r\n </div>\r\n </template>\r\n </el-page-header>\r\n <div class=\"mk-cms-appsettings__form_warp\" style=\"\r\n background: #fff;\r\n flex: 1;\r\n height: 100%;\r\n padding: 10px;\r\n margin: 10px;\r\n overflow: auto;\r\n \">\r\n <el-tabs v-model=\"activeTabName\" class=\"mk-cms-contents__body__right\">\r\n <el-tab-pane label=\"发布设置\" name=\"publish\">\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\">\r\n <el-form-item label=\"发布模式 : \">\r\n <el-radio-group v-model=\"CmsSettings.publish.mode\">\r\n <el-radio value=\"static\">静态发布</el-radio>\r\n <el-radio value=\"dynamic\">动态发布</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n <el-form-item label=\"兼容设备 : \">\r\n <el-checkbox-group v-model=\"CmsSettings.devices\">\r\n <el-checkbox label=\"PC端\" value=\"pc\" />\r\n <el-checkbox label=\"移动端\" value=\"mobile\" />\r\n </el-checkbox-group>\r\n </el-form-item>\r\n </el-form>\r\n <!-- <el-form :model=\"CmsSettings\" label-width=\"auto\" label-position=\"top\">\r\n <el-form-item label=\"文档模块 : \">\r\n <DocModuleEditForm :modules=\"CmsSettings.docModules\"></DocModuleEditForm>\r\n </el-form-item>\r\n </el-form> -->\r\n </el-tab-pane>\r\n <el-tab-pane label=\"栏目设置\" name=\"part\">\r\n <el-divider content-position=\"left\">栏目内容文档编辑器扩展设置</el-divider>\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\">\r\n <el-form-item label=\"开启栏目轮播图 : \">\r\n <el-switch v-model=\"CmsSettings.part.openBanner\" />\r\n </el-form-item>\r\n\r\n <el-form-item v-if=\"CmsSettings.part.openBanner\" label=\"轮播图尺寸 : \">\r\n <el-input v-model=\"CmsSettings.part.bannerImageSize\" placeholder=\"\" style=\"max-width: 200px;\" />\r\n </el-form-item>\r\n </el-form>\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\" label-position=\"top\">\r\n \r\n <el-form-item label=\"引入的Css : \">\r\n <el-input v-model=\"CmsSettings.part.doc.css\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个css url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n \r\n <el-form-item label=\"引入的Js : \">\r\n <el-input v-model=\"CmsSettings.part.doc.js\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个 js url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n </el-form>\r\n </el-tab-pane>\r\n <el-tab-pane label=\"内容设置\" name=\"content\">\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\">\r\n <el-form-item label=\"启用内容置顶 : \">\r\n <el-switch v-model=\"CmsSettings.content.useTop\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用最新内容 : \">\r\n <el-switch v-model=\"CmsSettings.content.useNew\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用热门推荐 : \">\r\n <el-switch v-model=\"CmsSettings.content.useHotRecommend\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用栏目推荐 : \">\r\n <el-switch v-model=\"CmsSettings.content.usePartRecommend\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用内容标签 : \">\r\n <el-switch v-model=\"CmsSettings.content.useTags\" />\r\n </el-form-item>\r\n <el-form-item label=\"启用内容资源库 : \">\r\n <el-switch v-model=\"CmsSettings.content.useAtlas\" />\r\n </el-form-item>\r\n <el-form-item label=\"内容封面图尺寸 : \">\r\n <el-input v-model=\"CmsSettings.content.coverImageSize\" placeholder=\"\" style=\"max-width: 200px;\" />\r\n </el-form-item>\r\n <el-form-item label=\"内容Banner图尺寸 : \">\r\n <el-input v-model=\"CmsSettings.content.bannerImageSize\" placeholder=\"\" style=\"max-width: 200px;\" />\r\n </el-form-item>\r\n </el-form>\r\n \r\n <el-divider content-position=\"left\">内容文档编辑器扩展设置</el-divider>\r\n <el-form :model=\"CmsSettings\" label-width=\"auto\" label-position=\"top\">\r\n <el-form-item label=\"引入的Css : \">\r\n <el-input v-model=\"CmsSettings.content.doc.css\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个css url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n \r\n <el-form-item label=\"引入的Js : \">\r\n <el-input v-model=\"CmsSettings.content.doc.js\"\r\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\r\n type=\"textarea\"\r\n placeholder=\"多个 js url , 号分割,逗号必须是英文逗号\"\r\n />\r\n </el-form-item>\r\n </el-form>\r\n </el-tab-pane>\r\n </el-tabs>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref,onMounted,watch, } from \"vue\";\r\nimport { useCmsSettings,CmsSettingsKEY,type CmsSettingsType } from \"../../cms-settings\"\r\nimport { MsConfigTable } from \"../../../ms/dataviews/ms-config/\"\r\nimport DocModuleEditForm from \"./DocModuleEditForm.vue\"\r\n\r\n// cms 配置\r\nconst CmsSettings = useCmsSettings(true); \r\n\r\n// 激活的tab\r\nconst activeTabName = ref(\"publish\");\r\n// 激活的tab\r\nconst loading = ref(false);\r\nconst changed = ref(false);\r\n\r\n\r\nconst saveHandle = async ()=>{\r\n\r\n if(changed.value){\r\n loading.value = true;\r\n await MsConfigTable.setConfigValue(CmsSettingsKEY,JSON.stringify(CmsSettings))\r\n loading.value = false;\r\n changed.value = false;\r\n }\r\n\r\n}\r\n\r\nonMounted(async ()=>{\r\n\r\n // 初始化\r\n const data = await MsConfigTable.getConfigValue<CmsSettingsType>(CmsSettingsKEY);\r\n if(data){ Object.assign(CmsSettings,data) }\r\n setTimeout(() => {\r\n loading.value = false;\r\n }, 500);\r\n // 数据改变\r\n watch(CmsSettings,()=>{\r\n changed.value = true;\r\n },{ deep:true })\r\n})\r\n</script>\r\n"],"names":["useCmsSettings","ref","MsConfigTable","CmsSettingsKEY","onMounted","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA+IM,UAAA,cAAcA,2BAAe,IAAI;AAGjC,UAAA,gBAAgBC,QAAI,SAAS;AAE7B,UAAA,UAAUA,QAAI,KAAK;AACnB,UAAA,UAAUA,QAAI,KAAK;AAGzB,UAAM,aAAa,YAAU;AAE3B,UAAG,QAAQ,OAAM;AACf,gBAAQ,QAAQ;AAChB,cAAMC,cAAAA,cAAc,eAAeC,YAAA,gBAAe,KAAK,UAAU,WAAW,CAAC;AAC7E,gBAAQ,QAAQ;AAChB,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IAAA;AAIFC,QAAAA,UAAU,YAAU;AAGlB,YAAM,OAAQ,MAAMF,cAAAA,cAAc,eAAgCC,YAAc,cAAA;AAChF,UAAG,MAAK;AAAS,eAAA,OAAO,aAAY,IAAI;AAAA,MAAE;AAC1C,iBAAW,MAAM;AACf,gBAAQ,QAAQ;AAAA,SACf,GAAG;AAENE,UAAA,MAAM,aAAY,MAAI;AACpB,gBAAQ,QAAQ;AAAA,MAAA,GAChB,EAAE,MAAK,KAAA,CAAM;AAAA,IAAA,CAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -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
|
|
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';
|
|
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
|
|
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\""],"names":[],"mappings":"AAAA,MAAe,eAAA;"}
|
|
@@ -218,28 +218,10 @@ const generateHtmlFromNodes = function $generateHtmlFromNodes(editor, selection)
|
|
|
218
218
|
const topLevelNode = topLevelChildren[i];
|
|
219
219
|
appendNodesToHTML(editor, topLevelNode, container, selection);
|
|
220
220
|
}
|
|
221
|
-
return
|
|
222
|
-
};
|
|
223
|
-
const prettifyHTMLElement = function(node, level) {
|
|
224
|
-
const indentBefore = Array.from({ length: level++ + 1 }).join(" ");
|
|
225
|
-
const indentAfter = Array.from({ length: level - 1 }).join(" ");
|
|
226
|
-
let textNode;
|
|
227
|
-
for (let i = 0; i < node.children.length; i++) {
|
|
228
|
-
textNode = document.createTextNode(`
|
|
229
|
-
${indentBefore}`);
|
|
230
|
-
node.insertBefore(textNode, node.children[i]);
|
|
231
|
-
prettifyHTMLElement(node.children[i], level);
|
|
232
|
-
if (node.lastElementChild === node.children[i]) {
|
|
233
|
-
textNode = document.createTextNode(`
|
|
234
|
-
${indentAfter}`);
|
|
235
|
-
node.appendChild(textNode);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return node;
|
|
221
|
+
return container.innerHTML.trim();
|
|
239
222
|
};
|
|
240
223
|
export {
|
|
241
224
|
generateHtmlFromNodes,
|
|
242
|
-
generateNodesFromHtml
|
|
243
|
-
prettifyHTMLElement
|
|
225
|
+
generateNodesFromHtml
|
|
244
226
|
};
|
|
245
227
|
//# sourceMappingURL=html.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sources":["../../../../../../src/components/basic/lexical-editor/utils/html.ts"],"sourcesContent":["import { \r\n ArtificialNode__DO_NOT_USE,\r\n $createLineBreakNode,\r\n LexicalEditor, \r\n LexicalNode,\r\n ElementNode,\r\n $isRootOrShadowRoot,\r\n $isBlockElementNode,\r\n ElementFormatType,\r\n $createParagraphNode,\r\n isInlineDomNode,\r\n $isElementNode,\r\n $getRoot,\r\n BaseSelection,\r\n $cloneWithProperties,\r\n $isTextNode,\r\n NodeSelection,\r\n RangeSelection,\r\n isHTMLElement\r\n} from \"lexical\";\r\n\r\nimport { isBlockDomNode } from \"@lexical/utils\"\r\nimport { $sliceSelectedTextNodeContent } from \"@lexical/selection\";\r\nimport { AttrMarkName } from \"../nodes\"\r\n\r\nconst domParser = new DOMParser()\r\n\r\n/**\r\n* 展开不确定的节点\r\n* @param allArtificialNodes \r\n*/\r\nconst unwrapArtificalNodes = function $unwrapArtificalNodes(allArtificialNodes:ElementNode[]|LexicalNode[]) {\r\n\r\n for (const node of allArtificialNodes) {\r\n\r\n if (node.getNextSibling() instanceof ArtificialNode__DO_NOT_USE) {\r\n node.insertAfter($createLineBreakNode());\r\n }\r\n }\r\n // Replace artificial node with it's children\r\n for (const node of allArtificialNodes) {\r\n\r\n // 元素的话\r\n if($isElementNode(node)){\r\n\r\n const children = node.getChildren();\r\n\r\n for (const child of children) {\r\n \r\n node.insertBefore(child);\r\n \r\n }\r\n \r\n node.remove();\r\n }\r\n }\r\n}\r\n\r\n// 获取节点转换器 就是 importDOM 定义的东西\r\nconst getConversionFunction = function(domNode:HTMLElement, editor:LexicalEditor) {\r\n\r\n const { nodeName } = domNode;\r\n\r\n const cachedConversions = editor._htmlConversions.get(nodeName.toLowerCase());\r\n\r\n let currentConversion = null;\r\n\r\n if (cachedConversions !== undefined) {\r\n\r\n for (const cachedConversion of cachedConversions) {\r\n\r\n const domConversion = cachedConversion(domNode);\r\n\r\n // 一直找到优先级最高的节点转换器\r\n if (domConversion !== null && (currentConversion === null || (currentConversion.priority || 0) < (domConversion.priority || 0))) {\r\n \r\n currentConversion = domConversion;\r\n }\r\n }\r\n\r\n }\r\n\r\n return currentConversion !== null ? currentConversion.conversion : null;\r\n}\r\n\r\n/**\r\n* 给内联节点包一个块节点\r\n* @param domNode \r\n* @param nodes \r\n* @param createWrapperFn \r\n* @returns \r\n*/\r\nconst wrapContinuousInlines = function (domNode : HTMLElement, nodes:LexicalNode[], createWrapperFn:Function) {\r\n\r\n const textAlign = domNode.style.textAlign;\r\n const out = [];\r\n let continuousInlines = [];\r\n // wrap contiguous inline child nodes in para\r\n for (let i = 0; i < nodes.length; i++) {\r\n\r\n const node = nodes[i];\r\n\r\n if ($isBlockElementNode(node)) {\r\n\r\n if (textAlign && !node.getFormat()) {\r\n node.setFormat(textAlign as ElementFormatType);\r\n }\r\n\r\n out.push(node);\r\n } \r\n else {\r\n\r\n continuousInlines.push(node);\r\n\r\n if (i === nodes.length - 1 || i < nodes.length - 1 && $isBlockElementNode(nodes[i + 1])) {\r\n const wrapper = createWrapperFn();\r\n wrapper.setFormat(textAlign);\r\n wrapper.append(...continuousInlines);\r\n out.push(wrapper);\r\n continuousInlines = [];\r\n }\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nconst isDomNodeBetweenTwoInlineNodes = function (node:HTMLElement) {\r\n\r\n if (node.nextSibling == null || node.previousSibling == null) {\r\n return false;\r\n }\r\n\r\n return isInlineDomNode(node.nextSibling) && isInlineDomNode(node.previousSibling);\r\n}\r\n\r\n\r\n/**\r\n* 根据元素节点创建 LexicalNode\r\n* @param node \r\n* @param editor \r\n* @param allArtificialNodes \r\n* @param hasBlockAncestorLexicalNode \r\n* @param forChildMap \r\n* @param parentLexicalNode \r\n* @returns \r\n*/\r\nconst createNodesFromElement = function (node:HTMLElement, editor:LexicalEditor, allArtificialNodes:ElementNode[], hasBlockAncestorLexicalNode:boolean, forChildMap = new Map(), parentLexicalNode?:LexicalNode) {\r\n\r\n\r\n let lexicalNodes:LexicalNode[] = [];\r\n\r\n let currentLexicalNode = null;\r\n \r\n \r\n // if(node.getAttribute(\"module-name\")){\r\n // console.log(node,mname)\r\n // }\r\n const transformFunction = getConversionFunction(node, editor);\r\n\r\n const transformOutput = transformFunction ? transformFunction(node) : null;\r\n \r\n let postTransform = null;\r\n\r\n if (transformOutput !== null) {\r\n\r\n postTransform = transformOutput.after;\r\n\r\n const transformNodes = transformOutput.node;\r\n\r\n currentLexicalNode = Array.isArray(transformNodes) ? transformNodes[transformNodes.length - 1] : transformNodes;\r\n\r\n if (currentLexicalNode !== null) {\r\n\r\n for (const [, forChildFunction] of forChildMap) {\r\n\r\n currentLexicalNode = forChildFunction(currentLexicalNode, parentLexicalNode);\r\n\r\n if (!currentLexicalNode) { break; }\r\n }\r\n\r\n if (currentLexicalNode) {\r\n lexicalNodes.push(...(Array.isArray(transformNodes) ? transformNodes : [currentLexicalNode]));\r\n }\r\n }\r\n\r\n if (transformOutput.forChild != null) {\r\n forChildMap.set(node.nodeName, transformOutput.forChild);\r\n }\r\n }\r\n\r\n // If the DOM node doesn't have a transformer, we don't know what\r\n // to do with it but we still need to process any childNodes.\r\n // 找到模块就不继续往下找了\r\n const children = isBlockDomNode(node) && node.hasAttribute(AttrMarkName) ? [] : node.childNodes;\r\n\r\n let childLexicalNodes = [];\r\n\r\n const hasBlockAncestorLexicalNodeForChildren = \r\n currentLexicalNode != null && \r\n (\r\n $isRootOrShadowRoot(currentLexicalNode) ? false \r\n : (currentLexicalNode != null && $isBlockElementNode(currentLexicalNode) || hasBlockAncestorLexicalNode)\r\n );\r\n \r\n for (let i = 0; i < children.length; i++) {\r\n childLexicalNodes.push(...createNodesFromElement(children[i] as HTMLElement, editor, allArtificialNodes, hasBlockAncestorLexicalNodeForChildren, new Map(forChildMap), currentLexicalNode));\r\n }\r\n\r\n if (postTransform != null) {\r\n childLexicalNodes = postTransform(childLexicalNodes);\r\n }\r\n\r\n if (isBlockDomNode(node)) {\r\n \r\n if (!hasBlockAncestorLexicalNodeForChildren) {\r\n childLexicalNodes = wrapContinuousInlines(node, childLexicalNodes, $createParagraphNode);\r\n } \r\n else {\r\n\r\n childLexicalNodes = wrapContinuousInlines(node, childLexicalNodes, () => {\r\n\r\n const artificialNode = new ArtificialNode__DO_NOT_USE();\r\n\r\n allArtificialNodes.push(artificialNode);\r\n\r\n return artificialNode;\r\n });\r\n }\r\n }\r\n\r\n if (currentLexicalNode == null) {\r\n\r\n if (childLexicalNodes.length > 0) {\r\n // If it hasn't been converted to a LexicalNode, we hoist its children\r\n // up to the same level as it.\r\n lexicalNodes = lexicalNodes.concat(childLexicalNodes);\r\n } \r\n else {\r\n if (isBlockDomNode(node) && isDomNodeBetweenTwoInlineNodes(node)) {\r\n // Empty block dom node that hasnt been converted, we replace it with a linebreak if its between inline nodes\r\n lexicalNodes = lexicalNodes.concat($createLineBreakNode());\r\n }\r\n }\r\n } \r\n else if ($isElementNode(currentLexicalNode)) {\r\n // If the current node is a ElementNode after conversion,\r\n // we can append all the children to it.\r\n currentLexicalNode.append(...childLexicalNodes);\r\n }\r\n return lexicalNodes;\r\n}\r\n\r\n\r\nexport const generateNodesFromHtml = function $generateNodesFromDOM(editor:LexicalEditor, html:string) {\r\n\r\n try {\r\n const doc = domParser.parseFromString(html,\"text/html\")\r\n\r\n const elements = doc.body.childNodes;\r\n \r\n let lexicalNodes:LexicalNode[] = [];\r\n \r\n const allArtificialNodes:ElementNode[] = [];\r\n \r\n for (let i = 0; i < elements.length; i++) {\r\n \r\n let element = elements[i] as HTMLElement; \r\n \r\n // 解决根不是块级元素的问题 忽略 换行符\r\n if(!isBlockDomNode(element) && element.nodeValue != \"\\n\" && element.nodeValue != \"\\r\\n\"){\r\n \r\n const p = document.createElement(\"p\")\r\n \r\n if(element instanceof Text){\r\n // .replace(/[\\n|\\r\\n]+/g,\"<br />\")\r\n p.textContent = element.data;\r\n \r\n }\r\n else{\r\n p.innerHTML = element.outerHTML ;\r\n }\r\n \r\n element = p;\r\n \r\n }\r\n \r\n const lexicalNode = createNodesFromElement(element, editor, allArtificialNodes,false);\r\n \r\n if (lexicalNode !== null) {\r\n lexicalNodes = lexicalNodes.concat(lexicalNode);\r\n }\r\n } \r\n unwrapArtificalNodes(allArtificialNodes);\r\n return lexicalNodes;\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * \r\n * @param editor \r\n * @param currentNode \r\n * @param parentElement \r\n * @param selection \r\n * @returns \r\n */\r\nconst appendNodesToHTML = function (editor:LexicalEditor, currentNode:LexicalNode, parentElement:HTMLElement|DocumentFragment, selection:BaseSelection|NodeSelection|RangeSelection|null = null) {\r\n\r\n let shouldInclude = selection !== null ? currentNode.isSelected(selection) : true;\r\n\r\n const shouldExclude = $isElementNode(currentNode) && currentNode.excludeFromCopy('html');\r\n\r\n let target = currentNode;\r\n\r\n if (selection !== null) {\r\n\r\n let clone = $cloneWithProperties(currentNode);\r\n\r\n clone = $isTextNode(clone) && selection !== null ? $sliceSelectedTextNodeContent(selection, clone) : clone;\r\n\r\n target = clone;\r\n }\r\n\r\n const children = $isElementNode(target) ? target.getChildren() : [];\r\n const registeredNode = editor._nodes.get(target.getType());\r\n\r\n let exportOutput;\r\n\r\n // Use HTMLConfig overrides, if available.\r\n if (registeredNode && registeredNode.exportDOM !== undefined) {\r\n exportOutput = registeredNode.exportDOM(editor, target);\r\n } \r\n else {\r\n exportOutput = target.exportDOM(editor);\r\n }\r\n\r\n const { element, after } = exportOutput;\r\n\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n const fragment = document.createDocumentFragment();\r\n\r\n for (let i = 0; i < children.length; i++) {\r\n\r\n const childNode = children[i];\r\n const shouldIncludeChild = appendNodesToHTML(editor, childNode, fragment, selection);\r\n\r\n if (!shouldInclude && $isElementNode(currentNode) && shouldIncludeChild && currentNode.extractWithChild(childNode, selection, 'html')) {\r\n shouldInclude = true;\r\n }\r\n }\r\n\r\n if (shouldInclude && !shouldExclude) {\r\n\r\n if (isHTMLElement(element)) { element.append(fragment); }\r\n\r\n parentElement.append(element);\r\n\r\n if (after) {\r\n\r\n const newElement = after.call(target, element);\r\n\r\n if (newElement) { element.replaceWith(newElement); }\r\n }\r\n\r\n } \r\n else {\r\n parentElement.append(fragment);\r\n }\r\n\r\n return shouldInclude;\r\n}\r\n\r\n/**\r\n * \r\n * @param editor \r\n * @param selection \r\n * @returns \r\n */\r\nexport const generateHtmlFromNodes = function $generateHtmlFromNodes(editor:LexicalEditor, selection?:BaseSelection) {\r\n\r\n // && typeof global.window === 'undefined'\r\n if (typeof document === 'undefined' || typeof window === 'undefined') {\r\n throw new Error('To use $generateHtmlFromNodes in headless mode please initialize a headless browser implementation such as JSDom before calling this function.');\r\n }\r\n\r\n const container = document.createElement('div');\r\n const root = $getRoot();\r\n const topLevelChildren = root.getChildren();\r\n\r\n for (let i = 0; i < topLevelChildren.length; i++) {\r\n\r\n const topLevelNode = topLevelChildren[i];\r\n\r\n appendNodesToHTML(editor, topLevelNode, container, selection);\r\n\r\n }\r\n\r\n return prettifyHTMLElement(container,0).innerHTML.trim();\r\n}\r\n\r\n/**\r\n * 美化html element\r\n * @param node \r\n * @param level \r\n * @returns \r\n */\r\nexport const prettifyHTMLElement = function (node: Element, level: number) {\r\n const indentBefore = Array.from({ length: level++ + 1 }).join(' ')\r\n const indentAfter = Array.from({ length: level - 1 }).join(' ')\r\n let textNode\r\n\r\n for (let i = 0; i < node.children.length; i++) {\r\n textNode = document.createTextNode(`\\n${indentBefore}`)\r\n node.insertBefore(textNode, node.children[i])\r\n prettifyHTMLElement(node.children[i], level)\r\n if (node.lastElementChild === node.children[i]) {\r\n textNode = document.createTextNode(`\\n${indentAfter}`)\r\n node.appendChild(textNode)\r\n }\r\n }\r\n return node\r\n}\r\n\r\n\r\n/**\r\n * 美化 html\r\n * @param str \r\n * @returns \r\n */\r\nexport const prettifyHTML = function (str: string) {\r\n const div = document.createElement('div')\r\n div.innerHTML = str.trim()\r\n return prettifyHTMLElement(div, 0).innerHTML.trim()\r\n}\r\n\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"html.js","sources":["../../../../../../src/components/basic/lexical-editor/utils/html.ts"],"sourcesContent":["import { \r\n ArtificialNode__DO_NOT_USE,\r\n $createLineBreakNode,\r\n LexicalEditor, \r\n LexicalNode,\r\n ElementNode,\r\n $isRootOrShadowRoot,\r\n $isBlockElementNode,\r\n ElementFormatType,\r\n $createParagraphNode,\r\n isInlineDomNode,\r\n $isElementNode,\r\n $getRoot,\r\n BaseSelection,\r\n $cloneWithProperties,\r\n $isTextNode,\r\n NodeSelection,\r\n RangeSelection,\r\n isHTMLElement\r\n} from \"lexical\";\r\n\r\nimport { isBlockDomNode } from \"@lexical/utils\"\r\nimport { $sliceSelectedTextNodeContent } from \"@lexical/selection\";\r\nimport { AttrMarkName } from \"../nodes\"\r\n\r\nconst domParser = new DOMParser()\r\n\r\n/**\r\n* 展开不确定的节点\r\n* @param allArtificialNodes \r\n*/\r\nconst unwrapArtificalNodes = function $unwrapArtificalNodes(allArtificialNodes:ElementNode[]|LexicalNode[]) {\r\n\r\n for (const node of allArtificialNodes) {\r\n\r\n if (node.getNextSibling() instanceof ArtificialNode__DO_NOT_USE) {\r\n node.insertAfter($createLineBreakNode());\r\n }\r\n }\r\n // Replace artificial node with it's children\r\n for (const node of allArtificialNodes) {\r\n\r\n // 元素的话\r\n if($isElementNode(node)){\r\n\r\n const children = node.getChildren();\r\n\r\n for (const child of children) {\r\n \r\n node.insertBefore(child);\r\n \r\n }\r\n \r\n node.remove();\r\n }\r\n }\r\n}\r\n\r\n// 获取节点转换器 就是 importDOM 定义的东西\r\nconst getConversionFunction = function(domNode:HTMLElement, editor:LexicalEditor) {\r\n\r\n const { nodeName } = domNode;\r\n\r\n const cachedConversions = editor._htmlConversions.get(nodeName.toLowerCase());\r\n\r\n let currentConversion = null;\r\n\r\n if (cachedConversions !== undefined) {\r\n\r\n for (const cachedConversion of cachedConversions) {\r\n\r\n const domConversion = cachedConversion(domNode);\r\n\r\n // 一直找到优先级最高的节点转换器\r\n if (domConversion !== null && (currentConversion === null || (currentConversion.priority || 0) < (domConversion.priority || 0))) {\r\n \r\n currentConversion = domConversion;\r\n }\r\n }\r\n\r\n }\r\n\r\n return currentConversion !== null ? currentConversion.conversion : null;\r\n}\r\n\r\n/**\r\n* 给内联节点包一个块节点\r\n* @param domNode \r\n* @param nodes \r\n* @param createWrapperFn \r\n* @returns \r\n*/\r\nconst wrapContinuousInlines = function (domNode : HTMLElement, nodes:LexicalNode[], createWrapperFn:Function) {\r\n\r\n const textAlign = domNode.style.textAlign;\r\n const out = [];\r\n let continuousInlines = [];\r\n // wrap contiguous inline child nodes in para\r\n for (let i = 0; i < nodes.length; i++) {\r\n\r\n const node = nodes[i];\r\n\r\n if ($isBlockElementNode(node)) {\r\n\r\n if (textAlign && !node.getFormat()) {\r\n node.setFormat(textAlign as ElementFormatType);\r\n }\r\n\r\n out.push(node);\r\n } \r\n else {\r\n\r\n continuousInlines.push(node);\r\n\r\n if (i === nodes.length - 1 || i < nodes.length - 1 && $isBlockElementNode(nodes[i + 1])) {\r\n const wrapper = createWrapperFn();\r\n wrapper.setFormat(textAlign);\r\n wrapper.append(...continuousInlines);\r\n out.push(wrapper);\r\n continuousInlines = [];\r\n }\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nconst isDomNodeBetweenTwoInlineNodes = function (node:HTMLElement) {\r\n\r\n if (node.nextSibling == null || node.previousSibling == null) {\r\n return false;\r\n }\r\n\r\n return isInlineDomNode(node.nextSibling) && isInlineDomNode(node.previousSibling);\r\n}\r\n\r\n\r\n/**\r\n* 根据元素节点创建 LexicalNode\r\n* @param node \r\n* @param editor \r\n* @param allArtificialNodes \r\n* @param hasBlockAncestorLexicalNode \r\n* @param forChildMap \r\n* @param parentLexicalNode \r\n* @returns \r\n*/\r\nconst createNodesFromElement = function (node:HTMLElement, editor:LexicalEditor, allArtificialNodes:ElementNode[], hasBlockAncestorLexicalNode:boolean, forChildMap = new Map(), parentLexicalNode?:LexicalNode) {\r\n\r\n\r\n let lexicalNodes:LexicalNode[] = [];\r\n\r\n let currentLexicalNode = null;\r\n \r\n \r\n // if(node.getAttribute(\"module-name\")){\r\n // console.log(node,mname)\r\n // }\r\n const transformFunction = getConversionFunction(node, editor);\r\n\r\n const transformOutput = transformFunction ? transformFunction(node) : null;\r\n \r\n let postTransform = null;\r\n\r\n if (transformOutput !== null) {\r\n\r\n postTransform = transformOutput.after;\r\n\r\n const transformNodes = transformOutput.node;\r\n\r\n currentLexicalNode = Array.isArray(transformNodes) ? transformNodes[transformNodes.length - 1] : transformNodes;\r\n\r\n if (currentLexicalNode !== null) {\r\n\r\n for (const [, forChildFunction] of forChildMap) {\r\n\r\n currentLexicalNode = forChildFunction(currentLexicalNode, parentLexicalNode);\r\n\r\n if (!currentLexicalNode) { break; }\r\n }\r\n\r\n if (currentLexicalNode) {\r\n lexicalNodes.push(...(Array.isArray(transformNodes) ? transformNodes : [currentLexicalNode]));\r\n }\r\n }\r\n\r\n if (transformOutput.forChild != null) {\r\n forChildMap.set(node.nodeName, transformOutput.forChild);\r\n }\r\n }\r\n\r\n // If the DOM node doesn't have a transformer, we don't know what\r\n // to do with it but we still need to process any childNodes.\r\n // 找到模块就不继续往下找了\r\n const children = isBlockDomNode(node) && node.hasAttribute(AttrMarkName) ? [] : node.childNodes;\r\n\r\n let childLexicalNodes = [];\r\n\r\n const hasBlockAncestorLexicalNodeForChildren = \r\n currentLexicalNode != null && \r\n (\r\n $isRootOrShadowRoot(currentLexicalNode) ? false \r\n : (currentLexicalNode != null && $isBlockElementNode(currentLexicalNode) || hasBlockAncestorLexicalNode)\r\n );\r\n \r\n for (let i = 0; i < children.length; i++) {\r\n childLexicalNodes.push(...createNodesFromElement(children[i] as HTMLElement, editor, allArtificialNodes, hasBlockAncestorLexicalNodeForChildren, new Map(forChildMap), currentLexicalNode));\r\n }\r\n\r\n if (postTransform != null) {\r\n childLexicalNodes = postTransform(childLexicalNodes);\r\n }\r\n\r\n if (isBlockDomNode(node)) {\r\n \r\n if (!hasBlockAncestorLexicalNodeForChildren) {\r\n childLexicalNodes = wrapContinuousInlines(node, childLexicalNodes, $createParagraphNode);\r\n } \r\n else {\r\n\r\n childLexicalNodes = wrapContinuousInlines(node, childLexicalNodes, () => {\r\n\r\n const artificialNode = new ArtificialNode__DO_NOT_USE();\r\n\r\n allArtificialNodes.push(artificialNode);\r\n\r\n return artificialNode;\r\n });\r\n }\r\n }\r\n\r\n if (currentLexicalNode == null) {\r\n\r\n if (childLexicalNodes.length > 0) {\r\n // If it hasn't been converted to a LexicalNode, we hoist its children\r\n // up to the same level as it.\r\n lexicalNodes = lexicalNodes.concat(childLexicalNodes);\r\n } \r\n else {\r\n if (isBlockDomNode(node) && isDomNodeBetweenTwoInlineNodes(node)) {\r\n // Empty block dom node that hasnt been converted, we replace it with a linebreak if its between inline nodes\r\n lexicalNodes = lexicalNodes.concat($createLineBreakNode());\r\n }\r\n }\r\n } \r\n else if ($isElementNode(currentLexicalNode)) {\r\n // If the current node is a ElementNode after conversion,\r\n // we can append all the children to it.\r\n currentLexicalNode.append(...childLexicalNodes);\r\n }\r\n return lexicalNodes;\r\n}\r\n\r\n\r\nexport const generateNodesFromHtml = function $generateNodesFromDOM(editor:LexicalEditor, html:string) {\r\n\r\n try {\r\n const doc = domParser.parseFromString(html,\"text/html\")\r\n\r\n const elements = doc.body.childNodes;\r\n \r\n let lexicalNodes:LexicalNode[] = [];\r\n \r\n const allArtificialNodes:ElementNode[] = [];\r\n \r\n for (let i = 0; i < elements.length; i++) {\r\n \r\n let element = elements[i] as HTMLElement; \r\n \r\n // 解决根不是块级元素的问题 忽略 换行符\r\n if(!isBlockDomNode(element) && element.nodeValue != \"\\n\" && element.nodeValue != \"\\r\\n\"){\r\n \r\n const p = document.createElement(\"p\")\r\n \r\n if(element instanceof Text){\r\n // .replace(/[\\n|\\r\\n]+/g,\"<br />\")\r\n p.textContent = element.data;\r\n \r\n }\r\n else{\r\n p.innerHTML = element.outerHTML ;\r\n }\r\n \r\n element = p;\r\n \r\n }\r\n \r\n const lexicalNode = createNodesFromElement(element, editor, allArtificialNodes,false);\r\n \r\n if (lexicalNode !== null) {\r\n lexicalNodes = lexicalNodes.concat(lexicalNode);\r\n }\r\n } \r\n unwrapArtificalNodes(allArtificialNodes);\r\n return lexicalNodes;\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * \r\n * @param editor \r\n * @param currentNode \r\n * @param parentElement \r\n * @param selection \r\n * @returns \r\n */\r\nconst appendNodesToHTML = function (editor:LexicalEditor, currentNode:LexicalNode, parentElement:HTMLElement|DocumentFragment, selection:BaseSelection|NodeSelection|RangeSelection|null = null) {\r\n\r\n let shouldInclude = selection !== null ? currentNode.isSelected(selection) : true;\r\n\r\n const shouldExclude = $isElementNode(currentNode) && currentNode.excludeFromCopy('html');\r\n\r\n let target = currentNode;\r\n\r\n if (selection !== null) {\r\n\r\n let clone = $cloneWithProperties(currentNode);\r\n\r\n clone = $isTextNode(clone) && selection !== null ? $sliceSelectedTextNodeContent(selection, clone) : clone;\r\n\r\n target = clone;\r\n }\r\n\r\n const children = $isElementNode(target) ? target.getChildren() : [];\r\n const registeredNode = editor._nodes.get(target.getType());\r\n\r\n let exportOutput;\r\n\r\n // Use HTMLConfig overrides, if available.\r\n if (registeredNode && registeredNode.exportDOM !== undefined) {\r\n exportOutput = registeredNode.exportDOM(editor, target);\r\n } \r\n else {\r\n exportOutput = target.exportDOM(editor);\r\n }\r\n\r\n const { element, after } = exportOutput;\r\n\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n const fragment = document.createDocumentFragment();\r\n\r\n for (let i = 0; i < children.length; i++) {\r\n\r\n const childNode = children[i];\r\n const shouldIncludeChild = appendNodesToHTML(editor, childNode, fragment, selection);\r\n\r\n if (!shouldInclude && $isElementNode(currentNode) && shouldIncludeChild && currentNode.extractWithChild(childNode, selection, 'html')) {\r\n shouldInclude = true;\r\n }\r\n }\r\n\r\n if (shouldInclude && !shouldExclude) {\r\n\r\n if (isHTMLElement(element)) { element.append(fragment); }\r\n\r\n parentElement.append(element);\r\n\r\n if (after) {\r\n\r\n const newElement = after.call(target, element);\r\n\r\n if (newElement) { element.replaceWith(newElement); }\r\n }\r\n\r\n } \r\n else {\r\n parentElement.append(fragment);\r\n }\r\n\r\n return shouldInclude;\r\n}\r\n\r\n/**\r\n * \r\n * @param editor \r\n * @param selection \r\n * @returns \r\n */\r\nexport const generateHtmlFromNodes = function $generateHtmlFromNodes(editor:LexicalEditor, selection?:BaseSelection) {\r\n\r\n // && typeof global.window === 'undefined'\r\n if (typeof document === 'undefined' || typeof window === 'undefined') {\r\n throw new Error('To use $generateHtmlFromNodes in headless mode please initialize a headless browser implementation such as JSDom before calling this function.');\r\n }\r\n\r\n const container = document.createElement('div');\r\n const root = $getRoot();\r\n const topLevelChildren = root.getChildren();\r\n\r\n for (let i = 0; i < topLevelChildren.length; i++) {\r\n\r\n const topLevelNode = topLevelChildren[i];\r\n\r\n appendNodesToHTML(editor, topLevelNode, container, selection);\r\n\r\n }\r\n\r\n return container.innerHTML.trim();\r\n}\r\n\r\n/**\r\n * 美化html element\r\n * @param node \r\n * @param level \r\n * @returns \r\n */\r\nexport const prettifyHTMLElement = function (node: Element, level: number) {\r\n const indentBefore = Array.from({ length: level++ + 1 }).join(' ')\r\n const indentAfter = Array.from({ length: level - 1 }).join(' ')\r\n let textNode\r\n\r\n for (let i = 0; i < node.children.length; i++) {\r\n textNode = document.createTextNode(`\\n${indentBefore}`)\r\n node.insertBefore(textNode, node.children[i])\r\n prettifyHTMLElement(node.children[i], level)\r\n if (node.lastElementChild === node.children[i]) {\r\n textNode = document.createTextNode(`\\n${indentAfter}`)\r\n node.appendChild(textNode)\r\n }\r\n }\r\n return node\r\n}\r\n\r\n\r\n/**\r\n * 美化 html\r\n * @param str \r\n * @returns \r\n */\r\nexport const prettifyHTML = function (str: string) {\r\n const div = document.createElement('div')\r\n div.innerHTML = str.trim()\r\n return prettifyHTMLElement(div, 0).innerHTML.trim()\r\n}\r\n\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sources":["../../../../../../src/components/basic/lexical-editor/utils/module.tsx"],"sourcesContent":["\r\nimport { Fragment,ref } from 'vue'\r\nimport { Dialoger } from '@maketribe/dm'\r\nimport { ElButton,ElInput } from \"element-plus\";\r\nimport { Search } from \"@element-plus/icons-vue\";\r\nimport { useLexicalEditorContext } from \"../composables\"\r\n\r\n/**\r\n *
|
|
1
|
+
{"version":3,"file":"module.js","sources":["../../../../../../src/components/basic/lexical-editor/utils/module.tsx"],"sourcesContent":["\r\nimport { Fragment,ref } from 'vue'\r\nimport { Dialoger } from '@maketribe/dm'\r\nimport { ElButton,ElInput } from \"element-plus\";\r\nimport { Search } from \"@element-plus/icons-vue\";\r\nimport { useLexicalEditorContext } from \"../composables\"\r\n\r\n/**\r\n * 显示模块选择 \r\n * @returns \r\n */\r\nexport const showModuleSelectDialog = async (namespace:string) => {\r\n\r\n const { modules } = useLexicalEditorContext(namespace);\r\n\r\n return new Promise(resolve => {\r\n \r\n const selectOption = ref<any|null>(null);\r\n const searchInputValue = ref(\"\");\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve({...selectOption.value as any});\r\n };\r\n\r\n // 点击块\r\n const clickHandle = (item:any)=>{\r\n selectOption.value = item;\r\n }\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"模版选择\",\r\n class: \"mk-doc-editor__module-template_dialog\",\r\n width: \"700px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n\r\n // 循环体\r\n const templateListComponent = modules.filter(item=>{\r\n if(searchInputValue.value){\r\n return item.name.indexOf(searchInputValue.value) >= 0 || item.title.indexOf(searchInputValue.value) >= 0\r\n }\r\n else{\r\n return true;\r\n }\r\n }).map(item=>{\r\n\r\n return <div \r\n class={`mk-doc-editor__module-template_dialog_list-item ${(item.cover ? 'cover':'')} ${(selectOption.value?.name == item.name ? 'active':'')}`} \r\n onClick={()=>clickHandle(item)}>\r\n {item.cover ? <img src={item.cover} /> :null}\r\n <div class=\"mk-doc-editor__module-template_dialog_list-item_title\">{item.title}</div>\r\n </div>\r\n })\r\n\r\n return <div class=\"mk-doc-editor__module-template_dialog_warp\">\r\n <ElInput v-model={searchInputValue.value} prefix-icon={Search} clearable={true} />\r\n <div class=\"mk-doc-editor__module-template_dialog_list-body\">\r\n {templateListComponent}\r\n </div>\r\n </div>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick} disabled={!selectOption.value}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["showModuleSelectDialog","namespace","modules","useLexicalEditorContext","Promise","resolve","selectOption","ref","searchInputValue","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","clickHandle","item","Dialoger","customRender","title","class","width","onClose","body","templateListComponent","filter","name","indexOf","map","_createVNode","cover","onClick","ElInput","$event","Search","footer","_Fragment","ElButton","default","_createTextVNode"],"mappings":";;;;;;;;;;;;;;;AAWaA,MAAAA,yBAAyB,OAAOC,cAAqB;AAEhE,QAAM;AAAA,IAAEC;AAAAA,EAAQ,IAAIC,wBAAwBF,SAAS;AAErD,SAAO,IAAIG,QAAQC,aAAW;AAE5B,UAAMC,eAAeC,IAAc,IAAI;AACvC,UAAMC,mBAAmBD,IAAI,EAAE;AAG/B,UAAME,oBAAoBA,MAAM;AAC9BC,qBAAeC,QAAO;AAAA;AAIxB,UAAMC,qBAAqBA,MAAM;AAC/BF,qBAAeC,QAAO;AACtBN,cAAQ;AAAA,QAAC,GAAGC,aAAaO;AAAAA,MAAY,CAAC;AAAA;AAIxC,UAAMC,cAAeC,UAAW;AAC9BT,mBAAaO,QAAQE;AAAAA;AAGvB,UAAML,iBAAiBM,SAASC,aAAa;AAAA,MAC3CC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,SAASA,MAAM;AACbX,uBAAeC,QAAO;AAAA,MACvB;AAAA,MACDW,MAAMA,MAAM;AAGV,cAAMC,wBAAwBrB,QAAQsB,OAAOT,UAAM;AACjD,cAAGP,iBAAiBK,OAAM;AACxB,mBAAOE,KAAKU,KAAKC,QAAQlB,iBAAiBK,KAAK,KAAK,KAAKE,KAAKG,MAAMQ,QAAQlB,iBAAiBK,KAAK,KAAK;AAAA,UACzG,OACI;AACF,mBAAO;AAAA,UACT;AAAA,QACF,CAAC,EAAEc,IAAIZ,UAAM;;AAEX,iBAAAa,YAAA,OAAA;AAAA,YAAA,SACO,mDAAoDb,KAAKc,QAAQ,UAAQ,EAAE,MAAMvB,kBAAaO,UAAbP,mBAAoBmB,SAAQV,KAAKU,OAAO,WAAS,EAAE;AAAA,YAAG,WACrIK,MAAIhB,YAAYC,IAAI;AAAA,UAAC,GAAA,CAC3BA,KAAKc,QAAKD,YAAA,OAAA;AAAA,YAAA,OAAcb,KAAKc;AAAAA,UAAY,GAAA,IAAA,IAAA,MAAID,YAAA,OAAA;AAAA,YAAA,SAAA;AAAA,UACsBb,GAAAA,CAAAA,KAAKG,KAAK,CAAA,CAAA,CAAA;AAAA,QAElF,CAAC;AAED,eAAAU,YAAA,OAAA;AAAA,UAAA,SAAA;AAAA,WAAAA,CAAAA,YAAAG,SAAA;AAAA,UAAA,cACoBvB,iBAAiBK;AAAAA,UAAK,uBAAAmB,YAAtBxB,iBAAiBK,QAAKmB;AAAAA,UAAA,eAAeC;AAAAA,UAAM,aAAa;AAAA,QAAI,GAAA,IAAA,GAAAL,YAAA,OAAA;AAAA,UAAA,SAAA;AAAA,QAAA,GAAA,CAE3EL,qBAAqB,CAAA,CAAA,CAAA;AAAA,MAG3B;AAAA,MACDW,QAAQA,MAAM;AACZ,eAAAN,YAAAO,UAAAP,MAAAA,CAAAA,YAAAQ,UAAA;AAAA,UAAA,WACqB3B;AAAAA,QAAiB,GAAA;AAAA,UAAA4B,SAAAA,MAAA,CAAAC,gBAAA,IAAA,CAAA;AAAA,SAAAV,GAAAA,YAAAQ,UAAA;AAAA,UAAA,QAAA;AAAA,UAAA,WACFxB;AAAAA,UAAkB,YAAY,CAACN,aAAaO;AAAAA,QAAK,GAAA;AAAA,UAAAwB,SAAAA,MAAA,CAAAC,gBAAA,IAAA,CAAA;AAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MAIvF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;"}
|
|
@@ -4,10 +4,12 @@ const CmsSettings = reactive({
|
|
|
4
4
|
publish: {
|
|
5
5
|
mode: "dynamic"
|
|
6
6
|
},
|
|
7
|
-
|
|
7
|
+
devices: ["pc"],
|
|
8
8
|
part: {
|
|
9
9
|
openBanner: true,
|
|
10
10
|
bannerImageSize: "1440*560",
|
|
11
|
+
docModules: [],
|
|
12
|
+
docTemplates: [],
|
|
11
13
|
doc: {
|
|
12
14
|
js: "",
|
|
13
15
|
css: ""
|
|
@@ -18,6 +20,8 @@ const CmsSettings = reactive({
|
|
|
18
20
|
js: "",
|
|
19
21
|
css: ""
|
|
20
22
|
},
|
|
23
|
+
docModules: [],
|
|
24
|
+
docTemplates: [],
|
|
21
25
|
useTop: true,
|
|
22
26
|
useNew: true,
|
|
23
27
|
useHotRecommend: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cms-settings.js","sources":["../../../../src/modules/cms/cms-settings.ts"],"sourcesContent":["import { reactive } from \"vue\"\r\nimport { MsConfigTable } from \"../ms/dataviews/ms-config/MsConfigTable\"\r\nimport { registerLexicalEditorModule,unRegisterLexicalEditorModule } from \"../../components/basic/lexical-editor\"\r\n\r\n/**\r\n * 发布配置\r\n */\r\ntype PublishSettings = {\r\n // 发布模式 静态发布和动态发布\r\n mode:'static' | 'dynamic'\r\n}\r\n\r\n/**\r\n * cms 文档编辑设置\r\n */\r\ntype CmsDocSettings = {\r\n css:string,\r\n js:string\r\n}\r\n\r\n/**\r\n * 栏目配置\r\n */\r\ntype PartSettings = {\r\n doc:CmsDocSettings\r\n openBanner:boolean,\r\n bannerImageSize:string\r\n}\r\n\r\n/**\r\n * 内容设置\r\n */\r\ntype ContentSettings = {\r\n /**\r\n * 内容文档设置\r\n */\r\n doc:CmsDocSettings,\r\n /**\r\n * 开启文档置顶功能\r\n */\r\n useTop:boolean,\r\n /**\r\n * 开启最新文档功能\r\n */\r\n useNew:boolean,\r\n /**\r\n * 开启热点推荐功能\r\n */\r\n useHotRecommend:boolean,\r\n /**\r\n * 开启栏目推荐功能\r\n */\r\n usePartRecommend:boolean,\r\n /**\r\n * 开启内容标签\r\n */\r\n useTags:boolean,\r\n /**\r\n * 开启媒体库\r\n */\r\n useAtlas:boolean,\r\n /**\r\n * 封面图的尺寸 默认 300 * 300\r\n */\r\n coverImageSize:string,\r\n /**\r\n * banner图的尺寸 默认 1440 * 560\r\n */\r\n bannerImageSize:string\r\n}\r\n\r\n/**\r\n * cms 系统设置\r\n */\r\nexport type CmsSettingsType = {\r\n // 发布配置\r\n publish:PublishSettings,\r\n
|
|
1
|
+
{"version":3,"file":"cms-settings.js","sources":["../../../../src/modules/cms/cms-settings.ts"],"sourcesContent":["import { reactive } from \"vue\"\r\nimport { MsConfigTable } from \"../ms/dataviews/ms-config/MsConfigTable\"\r\nimport { registerLexicalEditorModule,unRegisterLexicalEditorModule } from \"../../components/basic/lexical-editor\"\r\n\r\n/**\r\n * 发布配置\r\n */\r\ntype PublishSettings = {\r\n // 发布模式 静态发布和动态发布\r\n mode:'static' | 'dynamic'\r\n}\r\n\r\n/**\r\n * cms 文档编辑设置\r\n */\r\ntype CmsDocSettings = {\r\n css:string,\r\n js:string\r\n}\r\n\r\n/**\r\n * 栏目配置\r\n */\r\ntype PartSettings = {\r\n doc:CmsDocSettings\r\n openBanner:boolean,\r\n bannerImageSize:string,\r\n // 文档模块\r\n docModules:Array<any>,\r\n // 文档模版\r\n docTemplates:Array<any>\r\n}\r\n\r\n/**\r\n * 内容设置\r\n */\r\ntype ContentSettings = {\r\n /**\r\n * 内容文档设置\r\n */\r\n doc:CmsDocSettings,\r\n /**\r\n * 开启文档置顶功能\r\n */\r\n useTop:boolean,\r\n /**\r\n * 开启最新文档功能\r\n */\r\n useNew:boolean,\r\n /**\r\n * 开启热点推荐功能\r\n */\r\n useHotRecommend:boolean,\r\n /**\r\n * 开启栏目推荐功能\r\n */\r\n usePartRecommend:boolean,\r\n /**\r\n * 开启内容标签\r\n */\r\n useTags:boolean,\r\n /**\r\n * 开启媒体库\r\n */\r\n useAtlas:boolean,\r\n /**\r\n * 封面图的尺寸 默认 300 * 300\r\n */\r\n coverImageSize:string,\r\n /**\r\n * banner图的尺寸 默认 1440 * 560\r\n */\r\n bannerImageSize:string,\r\n // 文档模块\r\n docModules:Array<any>,\r\n // 文档模版\r\n docTemplates:Array<any>\r\n}\r\n\r\n/**\r\n * cms 系统设置\r\n */\r\nexport type CmsSettingsType = {\r\n // 发布配置\r\n publish:PublishSettings,\r\n devices:Array<'pc' | 'mobile'>,\r\n part:PartSettings,\r\n content:ContentSettings\r\n}\r\n\r\n/**\r\n * cms 配置\r\n */\r\nconst CmsSettings = reactive<CmsSettingsType>({\r\n publish:{\r\n mode:\"dynamic\"\r\n },\r\n devices:[\"pc\"],\r\n part:{\r\n openBanner:true,\r\n bannerImageSize:\"1440*560\",\r\n docModules:[],\r\n docTemplates:[],\r\n doc:{\r\n js:\"\",\r\n css:\"\"\r\n }\r\n },\r\n content:{\r\n doc:{\r\n js:\"\",\r\n css:\"\"\r\n },\r\n docModules:[],\r\n docTemplates:[],\r\n useTop:true,\r\n useNew:true,\r\n useHotRecommend:false,\r\n usePartRecommend:false,\r\n useTags:false,\r\n useAtlas:false,\r\n coverImageSize:\"300*300\",\r\n bannerImageSize:\"1440*560\"\r\n }\r\n})\r\n\r\n/**\r\n * \r\n */\r\nexport const CmsSettingsKEY = \"cms:content:man:settings\";\r\n\r\n/**\r\n * 使用cms配置\r\n * @param load \r\n */\r\nexport const useCmsSettings = function(load:boolean|undefined = false):CmsSettingsType{\r\n\r\n if(load){\r\n \r\n MsConfigTable.getConfigValue<CmsSettingsType>(CmsSettingsKEY).then(data=>{\r\n if(data){ \r\n // 卸载掉老旧模块\r\n // CmsSettings.docModules.forEach(item=> unRegisterDocModule(item.name) );\r\n Object.assign(CmsSettings,data);\r\n // 加载新内容安装新模块\r\n // CmsSettings.docModules.forEach(item=>registerLexicalEditorModule(item,\"\"));\r\n }\r\n });\r\n\r\n }\r\n\r\n return CmsSettings;\r\n}\r\n"],"names":[],"mappings":";;AA6FA,MAAM,cAAc,SAA0B;AAAA,EAC5C,SAAQ;AAAA,IACN,MAAK;AAAA,EACP;AAAA,EACA,SAAQ,CAAC,IAAI;AAAA,EACb,MAAK;AAAA,IACH,YAAW;AAAA,IACX,iBAAgB;AAAA,IAChB,YAAW,CAAC;AAAA,IACZ,cAAa,CAAC;AAAA,IACd,KAAI;AAAA,MACF,IAAG;AAAA,MACH,KAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,SAAQ;AAAA,IACN,KAAI;AAAA,MACF,IAAG;AAAA,MACH,KAAI;AAAA,IACN;AAAA,IACA,YAAW,CAAC;AAAA,IACZ,cAAa,CAAC;AAAA,IACd,QAAO;AAAA,IACP,QAAO;AAAA,IACP,iBAAgB;AAAA,IAChB,kBAAiB;AAAA,IACjB,SAAQ;AAAA,IACR,UAAS;AAAA,IACT,gBAAe;AAAA,IACf,iBAAgB;AAAA,EAClB;AACF,CAAC;AAKM,MAAM,iBAAiB;AAMjB,MAAA,iBAAkB,SAAS,OAAyB,OAAsB;AAErF,MAAG,MAAK;AAEN,kBAAc,eAAgC,cAAc,EAAE,KAAK,CAAM,SAAA;AACvE,UAAG,MAAK;AAGC,eAAA,OAAO,aAAY,IAAI;AAAA,MAGhC;AAAA,IAAA,CACD;AAAA,EAEH;AAEO,SAAA;AACT;"}
|