tav-ui
Version:
1 lines • 26.9 kB
Source Map (JSON)
{"version":3,"file":"use-editor-plugin2.mjs","sources":["../../../../../../../../packages/components/editor/src/hooks/use-editor-plugin.ts"],"sourcesContent":["import { type ComputedRef, computed, ref } from 'vue'\nimport sanitizeHtml from 'sanitize-html'\nimport { type UseRequestReturn } from '@tav-ui/components/file/src/hooks/use-request'\nimport { type EditorPluginImageUploadHandler, type EditorProps } from '../typings'\n// import { type UseApiReturn } from './use-api'\n\n// TODO: import katex for tinymce latex, see: https://stackoverflow.com/questions/76202508/how-to-add-a-custom-tinymce-plugin-with-vue3-nuxt-using-the-pluginmanager\n// TODO: support markdown for tinymce, see: https://github.com/prathamVaidya/supercode-tinymce-plugin\n\nexport function useEditorPlugin(options: {\n mergedProps: ComputedRef<EditorProps>\n handleApi: UseRequestReturn['handleApi']\n apiResult: UseRequestReturn['result']\n // editorImageVars: Record<string, any>\n // uploadImageApiOptions: UseApiReturn['apiActions']['uploadImageApiOptions']\n}) {\n const { mergedProps, handleApi, apiResult /*editorImageVars, uploadImageApiOptions*/ } = options\n\n /** 高级列表,see:https://www.tiny.cloud/docs/tinymce/5/advlist/ */\n const advlistPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/advlist'),\n name: 'advlist',\n options: {},\n }\n\n /** 锚点,see:https://www.tiny.cloud/docs/tinymce/5/anchor/ */\n const anchorPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/anchor'),\n name: 'anchor',\n options: {},\n }\n\n /** 自动链接,see:https://www.tiny.cloud/docs/tinymce/5/autolink/ */\n const autolinkPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/autolink'),\n name: 'autolink',\n options: {\n default_link_target: '_blank',\n },\n }\n\n /**\n * 编辑器高度自适应,see:https://www.tiny.cloud/docs/tinymce/5/autoresize/\n * 1. 引入此插件时,Init 里设置的 height 将失效\n */\n const autoresizePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/autoresize'),\n name: 'autoresize',\n options: {},\n }\n\n /** 自动存稿,see:https://www.tiny.cloud/docs/tinymce/5/autosave/ */\n const autosavePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/autosave'),\n name: 'autosave',\n options: {\n // autosave_restore_when_empty: true, // 如果为 true 打开/关闭 弹窗后会保留结果暂时的富文本编辑都是一次性的,暂时不开启\n },\n }\n\n /** 特殊字符,see:https://www.tiny.cloud/docs/tinymce/5/charmap/ */\n const charmapPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/charmap'),\n name: 'charmap',\n options: {},\n }\n\n /** 代码,see:https://www.tiny.cloud/docs/tinymce/5/code/ */\n const codePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/code'),\n name: 'code',\n options: {},\n }\n\n /** 代码示例,see:https://www.tiny.cloud/docs/tinymce/5/code/ */\n const codesamplePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/codesample'),\n name: 'codesample',\n options: {},\n }\n\n /** 文字方向,see:https://www.tiny.cloud/docs/tinymce/5/directionality/ */\n const directionalityPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/directionality'),\n name: 'directionality',\n options: {},\n }\n\n /** 表情,see:https://www.tiny.cloud/docs/tinymce/5/emoticons/ */\n const emoticonsPlugin: Record<string, any> = {\n setup: () => {\n // @ts-ignore\n import('tinymce/plugins/emoticons')\n // @ts-ignore\n import('tinymce/plugins/emoticons/js/emojis')\n },\n name: 'emoticons',\n options: {},\n }\n\n /** see:https://www.tiny.cloud/docs/tinymce/5/fullpage/ */\n const fullpagePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/fullpage'),\n name: 'fullpage',\n options: {},\n }\n\n /** 全屏,see:https://www.tiny.cloud/docs/tinymce/5/fullscreen/ */\n const fullscreenPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/fullscreen'),\n name: 'fullscreen',\n options: {},\n }\n\n /** 帮助,see:https://www.tiny.cloud/docs/tinymce/5/help/ */\n const helpPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/help'),\n name: 'help',\n options: {\n help_tabs: [\n 'shortcuts',\n // \"keyboardnav\",\n // \"plugins\",\n // \"versions\"\n ],\n },\n }\n\n /** 分割线,see:https://www.tiny.cloud/docs/tinymce/5/hr/ */\n const hrPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/hr'),\n name: 'hr',\n options: {},\n }\n\n /** 图片,see:https://www.tiny.cloud/docs/tinymce/5/image/ */\n const imagePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/image'),\n name: 'image',\n options: {\n images_reuse_filename: true,\n images_upload_handler: (...args: any[]) =>\n editorPluginImageUploadHandler(\n mergedProps,\n handleApi,\n apiResult,\n // editorImageVars,\n // uploadImageApiOptions,\n args[0],\n args[1],\n args[2]\n ),\n },\n }\n /** 图片编辑,see:https://www.tiny.cloud/docs/tinymce/5/editimage/ */\n const imagetoolsPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/imagetools'),\n name: 'imagetools',\n options: {},\n }\n\n /** 导入 css,see:https://www.tiny.cloud/docs/tinymce/5/importcss/ */\n const importcssPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/importcss'),\n name: 'importcss',\n options: {},\n }\n\n /** 时间/日期,see:https://www.tiny.cloud/docs/tinymce/5/insertdatetime/ */\n const insertdatetimePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/insertdatetime'),\n name: 'insertdatetime',\n options: {},\n }\n\n /** 邮件模版标准 html 输出,see:https://www.tiny.cloud/docs/tinymce/5/legacyoutput/ */\n const legacyoutputPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/legacyoutput'),\n name: 'legacyoutput',\n options: {},\n }\n\n /** 超链接,see:https://www.tiny.cloud/docs/tinymce/5/link/ */\n const linkPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/link'),\n name: 'link',\n options: {\n default_link_target: '_blank',\n },\n }\n\n /** 列表,see:https://www.tiny.cloud/docs/tinymce/5/lists/ */\n const listsPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/lists'),\n name: 'lists',\n options: {},\n }\n\n /** 媒体,see:https://www.tiny.cloud/docs/tinymce/5/media/ */\n const mediaPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/media'),\n name: 'media',\n options: {},\n }\n\n /** 不间断空格,see:https://www.tiny.cloud/docs/tinymce/5/nonbreaking/ */\n const nonbreakingPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/nonbreaking'),\n name: 'nonbreaking',\n options: {},\n }\n\n /** 无法编辑控制,see:https://www.tiny.cloud/docs/tinymce/5/noneditable/ */\n const noneditablePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/noneditable'),\n name: 'noneditable',\n options: {},\n }\n\n /** 分页符,see:https://www.tiny.cloud/docs/tinymce/5/pagebreak/ */\n const pagebreakPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/pagebreak'),\n name: 'pagebreak',\n options: {},\n }\n\n /** 粘贴内容处理,see:https://www.tiny.cloud/docs/tinymce/5/paste/ */\n const pastePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/paste'),\n name: 'paste',\n options: {\n paste_block_drop: false,\n paste_filter_drop: false,\n // paste_as_text: true, // 如果只想保留文字需要开启\n paste_merge_formats: false,\n paste_preprocess: editorPluginPastePreprocessHandler,\n },\n }\n\n /** 预览,see:https://www.tiny.cloud/docs/tinymce/5/preview/ */\n const previewPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/preview'),\n name: 'preview',\n options: {},\n }\n\n /** 打印,see:https://www.tiny.cloud/docs/tinymce/5/print/ */\n const printPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/print'),\n name: 'print',\n options: {},\n }\n\n /** 快捷栏,see:https://www.tiny.cloud/docs/tinymce/5/quickbars/ */\n const quickbarsPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/quickbars'),\n name: 'quickbars',\n options: {\n quickbars_insert_toolbar: '',\n quickbars_selection_toolbar: 'formatselect bold italic | aligns blockquote',\n quickbars_image_toolbar: '', //TODO: ?\n },\n }\n\n /** 保存,see:https://www.tiny.cloud/docs/tinymce/5/save/ */\n const savePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/save'),\n name: 'save',\n options: {},\n }\n\n /** 查找/替换,see:https://www.tiny.cloud/docs/tinymce/5/searchreplace/ */\n const searchreplacePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/searchreplace'),\n name: 'searchreplace',\n options: {},\n }\n\n /**\n * 拼写检查,see:https://www.tiny.cloud/docs/tinymce/5/spellchecker/\n * 1. 暂不支持中文\n */\n const spellcheckerPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/spellchecker'),\n name: 'spellchecker',\n options: {},\n }\n\n /** 聚焦,see:https://www.tiny.cloud/docs/tinymce/5/tabfocus/ */\n const tabfocusPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/tabfocus'),\n name: 'tabfocus',\n options: {},\n }\n\n /** 表格,see:https://www.tiny.cloud/docs/tinymce/5/table/ */\n const tablePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/table'),\n name: 'table',\n options: {},\n }\n\n /** 模版,see:https://www.tiny.cloud/docs/tinymce/5/template/ */\n const templatePlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/template'),\n name: 'template',\n options: {},\n }\n\n /** md 支持,see:https://www.tiny.cloud/docs/tinymce/5/textpattern/ */\n const textpatternPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/textpattern'),\n name: 'textpattern',\n options: {},\n }\n\n /** 大纲,see:https://www.tiny.cloud/docs/tinymce/5/tableofcontents/ */\n const tocPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/toc'),\n name: 'toc',\n options: {},\n }\n\n /** 元素范围 see:https://www.tiny.cloud/docs/tinymce/5/visualblocks/ */\n const visualblocksPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/visualblocks'),\n name: 'visualblocks',\n options: {},\n }\n /** 可见字符,see:https://www.tiny.cloud/docs/tinymce/5/visualchars/ */\n const visualcharsPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/visualchars'),\n name: 'visualchars',\n options: {},\n }\n\n /** 字数统计,see:https://www.tiny.cloud/docs/tinymce/5/wordcount/ */\n const wordcountPlugin: Record<string, any> = {\n // @ts-ignore\n setup: () => import('tinymce/plugins/wordcount'),\n name: 'wordcount',\n options: {},\n }\n\n const plugins = [\n advlistPlugin,\n anchorPlugin,\n autolinkPlugin,\n autoresizePlugin,\n autosavePlugin,\n charmapPlugin,\n codePlugin,\n codesamplePlugin,\n directionalityPlugin,\n emoticonsPlugin,\n fullpagePlugin,\n fullscreenPlugin,\n helpPlugin,\n hrPlugin,\n imagePlugin,\n imagetoolsPlugin,\n importcssPlugin,\n insertdatetimePlugin,\n legacyoutputPlugin,\n linkPlugin,\n listsPlugin,\n mediaPlugin,\n nonbreakingPlugin,\n noneditablePlugin,\n pagebreakPlugin,\n pastePlugin,\n previewPlugin,\n printPlugin,\n quickbarsPlugin,\n savePlugin,\n searchreplacePlugin,\n spellcheckerPlugin,\n tabfocusPlugin,\n tablePlugin,\n templatePlugin,\n textpatternPlugin,\n tocPlugin,\n visualblocksPlugin,\n visualcharsPlugin,\n wordcountPlugin,\n ]\n\n const filterPluginNames = [\n 'autoresize',\n 'autosave',\n 'charmap',\n 'codesample',\n 'emoticons',\n 'fullpage',\n 'help',\n 'image',\n 'imagetools',\n 'importcss',\n 'insertdatetime',\n 'legacyoutput',\n 'media',\n 'print',\n 'spellchecker',\n 'tabfocus',\n 'template',\n 'toc',\n 'wordcount',\n ]\n\n const usePlugins = plugins.filter((plugin) => !filterPluginNames.includes(plugin.name))\n\n const isLoaded = ref(false)\n function setupPlugins() {\n for (let i = 0; i < usePlugins.length; i++) {\n usePlugins[i].setup()\n }\n isLoaded.value = true\n }\n\n const pluginConfig = computed(() => {\n const imagePlugin = usePlugins.find((usePlugin) => usePlugin.name === 'image')\n if (imagePlugin) {\n imagePlugin.options = {\n ...imagePlugin.options,\n images_file_types: mergedProps.value.imageAccept,\n }\n }\n\n const imagetoolsPlugin = usePlugins.find((usePlugin) => usePlugin.name === 'imagetools')\n if (imagetoolsPlugin) {\n imagetoolsPlugin.options = {\n // ...imagetoolsPlugin.options,\n // ...(editorImageVars.urlPrefix\n // ? {\n // imagetools_cors_hosts: [\n // 'localhost.proxyman.io',\n // editorImageVars.urlPrefix.split('//')[1],\n // ],\n // // imagetools_proxy: editorImageVars.urlPrefix,\n // }\n // : {}),\n }\n }\n\n const usePluginNames = usePlugins.map((usePlugin) => usePlugin.name).join(' ')\n const usePluginOptions = usePlugins.reduce((result, cur) => {\n if (cur.options && Object.keys(cur.options).length > 0) {\n result = {\n ...result,\n ...cur.options,\n }\n }\n return result\n }, {} as Record<string, any>)\n\n return {\n // plugins: isLoaded.value ? usePluginNames : undefined, // tinymce not support dynamic load plugin\n plugins: usePluginNames,\n pluginOptions: usePluginOptions,\n }\n })\n\n return {\n setupPlugins,\n pluginConfig,\n }\n}\n\nfunction editorPluginImageUploadHandler(\n mergedProps: ComputedRef<EditorProps>,\n handleApi: UseRequestReturn['handleApi'],\n apiResult: UseRequestReturn['result'],\n // editorImageVars: Record<string, any>,\n // uploadImageApiOptions: UseApiReturn['apiActions']['uploadImageApiOptions'],\n blobInfo: Parameters<EditorPluginImageUploadHandler>[0],\n success: Parameters<EditorPluginImageUploadHandler>[1],\n failure: Parameters<EditorPluginImageUploadHandler>[2]\n): ReturnType<EditorPluginImageUploadHandler> {\n const file = blobInfo.blob() as unknown as File\n // const imageOptions = uploadImageApiOptions(mergedProps.value.apiParams, [file])\n const imageOptions = null\n if (!imageOptions) return\n // handleApi(imageOptions)\n // .then(() => {\n // const images = [...apiResult.value]\n // const imageUrl = images[0].imageOriginUrl\n // .replace(`\\${${editorImageVars.urlPrefixProp}}`, editorImageVars.urlPrefix)\n // .replace(`\\${${editorImageVars.keyProp}}`, editorImageVars.key)\n\n // success(imageUrl)\n // })\n // .catch((err: any) => {\n // failure(err)\n // })\n}\n\nfunction editorPluginPastePreprocessHandler(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, pasteContentinfo] = args\n const result = sanitizeHtml(pasteContentinfo.content, {\n allowedTags: sanitizeHtml.defaults.allowedTags.filter(\n (at) => !['code', 'samp', 'ruby'].includes(at)\n ),\n allowedAttributes: {\n ...sanitizeHtml.defaults.allowedTags.reduce((result, cur) => {\n if (cur === 'a') {\n result[cur] = ['href', 'name', 'target']\n } else {\n result[cur] = []\n }\n return result\n }, {} as any),\n },\n disallowedTagsMode: 'discard',\n })\n pasteContentinfo.content = result\n}\n"],"names":[],"mappings":"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"}