@wangeditor-next/core 6.4.1 → 6.4.3

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 (103) hide show
  1. package/dist/index.d.ts +1127 -0
  2. package/dist/index.js +29 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +29 -2
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/upload.d.ts +454 -0
  7. package/dist/upload.js +4 -2
  8. package/dist/upload.js.map +1 -1
  9. package/dist/upload.mjs +4 -2
  10. package/dist/upload.mjs.map +1 -1
  11. package/package.json +11 -12
  12. package/dist/core/src/config/index.d.ts +0 -13
  13. package/dist/core/src/config/interface.d.ts +0 -317
  14. package/dist/core/src/config/register.d.ts +0 -12
  15. package/dist/core/src/config/style-mode.d.ts +0 -8
  16. package/dist/core/src/constants/index.d.ts +0 -1
  17. package/dist/core/src/constants/svg.d.ts +0 -12
  18. package/dist/core/src/create/bind-node-relation.d.ts +0 -15
  19. package/dist/core/src/create/create-editor.d.ts +0 -10
  20. package/dist/core/src/create/create-toolbar.d.ts +0 -14
  21. package/dist/core/src/create/helper.d.ts +0 -37
  22. package/dist/core/src/create/index.d.ts +0 -8
  23. package/dist/core/src/editor/dom-editor.d.ts +0 -154
  24. package/dist/core/src/editor/interface.d.ts +0 -90
  25. package/dist/core/src/editor/plugins/with-config.d.ts +0 -7
  26. package/dist/core/src/editor/plugins/with-content.d.ts +0 -7
  27. package/dist/core/src/editor/plugins/with-dom.d.ts +0 -10
  28. package/dist/core/src/editor/plugins/with-emitter.d.ts +0 -7
  29. package/dist/core/src/editor/plugins/with-event-data.d.ts +0 -7
  30. package/dist/core/src/editor/plugins/with-history.d.ts +0 -7
  31. package/dist/core/src/editor/plugins/with-max-length.d.ts +0 -7
  32. package/dist/core/src/editor/plugins/with-selection.d.ts +0 -7
  33. package/dist/core/src/i18n/index.d.ts +0 -32
  34. package/dist/core/src/index.d.ts +0 -45
  35. package/dist/core/src/menus/bar/HoverBar.d.ts +0 -48
  36. package/dist/core/src/menus/bar/Toolbar.d.ts +0 -38
  37. package/dist/core/src/menus/bar-item/BaseButton.d.ts +0 -26
  38. package/dist/core/src/menus/bar-item/DropPanelButton.d.ts +0 -14
  39. package/dist/core/src/menus/bar-item/GroupButton.d.ts +0 -17
  40. package/dist/core/src/menus/bar-item/ModalButton.d.ts +0 -25
  41. package/dist/core/src/menus/bar-item/Select.d.ts +0 -22
  42. package/dist/core/src/menus/bar-item/SimpleButton.d.ts +0 -11
  43. package/dist/core/src/menus/bar-item/index.d.ts +0 -24
  44. package/dist/core/src/menus/bar-item/tooltip.d.ts +0 -6
  45. package/dist/core/src/menus/helpers/helpers.d.ts +0 -18
  46. package/dist/core/src/menus/helpers/position.d.ts +0 -36
  47. package/dist/core/src/menus/index.d.ts +0 -9
  48. package/dist/core/src/menus/interface.d.ts +0 -65
  49. package/dist/core/src/menus/panel-and-modal/BaseClass.d.ts +0 -26
  50. package/dist/core/src/menus/panel-and-modal/DropPanel.d.ts +0 -12
  51. package/dist/core/src/menus/panel-and-modal/Modal.d.ts +0 -44
  52. package/dist/core/src/menus/panel-and-modal/SelectList.d.ts +0 -20
  53. package/dist/core/src/menus/register.d.ts +0 -15
  54. package/dist/core/src/parse-html/helper.d.ts +0 -10
  55. package/dist/core/src/parse-html/index.d.ts +0 -35
  56. package/dist/core/src/parse-html/parse-common-elem-html.d.ts +0 -15
  57. package/dist/core/src/parse-html/parse-elem-html.d.ts +0 -15
  58. package/dist/core/src/parse-html/parse-text-elem-html.d.ts +0 -16
  59. package/dist/core/src/render/element/getRenderElem.d.ts +0 -11
  60. package/dist/core/src/render/element/renderElement.d.ts +0 -9
  61. package/dist/core/src/render/element/renderStyle.d.ts +0 -15
  62. package/dist/core/src/render/helper.d.ts +0 -6
  63. package/dist/core/src/render/index.d.ts +0 -27
  64. package/dist/core/src/render/node2Vnode.d.ts +0 -15
  65. package/dist/core/src/render/text/genVnode.d.ts +0 -9
  66. package/dist/core/src/render/text/renderStyle.d.ts +0 -15
  67. package/dist/core/src/render/text/renderText.d.ts +0 -9
  68. package/dist/core/src/text-area/TextArea.d.ts +0 -52
  69. package/dist/core/src/text-area/event-handlers/beforeInput.d.ts +0 -8
  70. package/dist/core/src/text-area/event-handlers/blur.d.ts +0 -8
  71. package/dist/core/src/text-area/event-handlers/click.d.ts +0 -8
  72. package/dist/core/src/text-area/event-handlers/composition.d.ts +0 -27
  73. package/dist/core/src/text-area/event-handlers/copy.d.ts +0 -8
  74. package/dist/core/src/text-area/event-handlers/cut.d.ts +0 -8
  75. package/dist/core/src/text-area/event-handlers/drag.d.ts +0 -9
  76. package/dist/core/src/text-area/event-handlers/drop.d.ts +0 -8
  77. package/dist/core/src/text-area/event-handlers/focus.d.ts +0 -8
  78. package/dist/core/src/text-area/event-handlers/index.d.ts +0 -35
  79. package/dist/core/src/text-area/event-handlers/keydown.d.ts +0 -8
  80. package/dist/core/src/text-area/event-handlers/keypress.d.ts +0 -8
  81. package/dist/core/src/text-area/event-handlers/paste.d.ts +0 -8
  82. package/dist/core/src/text-area/helpers.d.ts +0 -30
  83. package/dist/core/src/text-area/place-holder.d.ts +0 -18
  84. package/dist/core/src/text-area/syncSelection.d.ts +0 -19
  85. package/dist/core/src/text-area/update-view.d.ts +0 -13
  86. package/dist/core/src/to-html/elem2html.d.ts +0 -9
  87. package/dist/core/src/to-html/index.d.ts +0 -44
  88. package/dist/core/src/to-html/node2html.d.ts +0 -12
  89. package/dist/core/src/to-html/text2html.d.ts +0 -9
  90. package/dist/core/src/upload/createUploader.d.ts +0 -14
  91. package/dist/core/src/upload/createUppyUploader.d.ts +0 -7
  92. package/dist/core/src/upload/index.d.ts +0 -9
  93. package/dist/core/src/upload/interface.d.ts +0 -72
  94. package/dist/core/src/upload.d.ts +0 -5
  95. package/dist/core/src/utils/dom.d.ts +0 -103
  96. package/dist/core/src/utils/hotkeys.d.ts +0 -35
  97. package/dist/core/src/utils/key.d.ts +0 -11
  98. package/dist/core/src/utils/line.d.ts +0 -14
  99. package/dist/core/src/utils/sanitize-html.d.ts +0 -5
  100. package/dist/core/src/utils/ua.d.ts +0 -14
  101. package/dist/core/src/utils/util.d.ts +0 -28
  102. package/dist/core/src/utils/vdom.d.ts +0 -34
  103. package/dist/core/src/utils/weak-maps.d.ts +0 -60
@@ -1 +1 @@
1
- {"version":3,"file":"upload.mjs","sources":["../src/utils/util.ts","../src/upload/createUppyUploader.ts","../src/upload/createUploader.ts"],"sourcesContent":["/**\n * @description 工具函数\n * @author wangfupeng\n */\n\nimport forEach from 'lodash.foreach'\nimport { nanoid } from 'nanoid'\n\ntype PromiseCallback = (value: void) => void | PromiseLike<void>\n\n/**\n * 获取随机数字符串\n * @param prefix 前缀\n * @returns 随机数字符串\n */\nexport function genRandomStr(prefix: string = 'r'): string {\n return `${prefix}-${nanoid()}`\n}\n\nexport function promiseResolveThen(fn: Function) {\n Promise.resolve().then(fn as PromiseCallback)\n}\n\n/**\n * 追加 url query 参数\n * @param url url\n * @param data data\n */\nexport function addQueryToUrl(url: string, data: object): string {\n const [initialUrlWithoutHash, hash] = url.split('#')\n let urlWithoutHash = initialUrlWithoutHash\n\n // 拼接 query string\n const queryArr: string[] = []\n\n forEach(data, (val, key) => {\n queryArr.push(`${key}=${val}`)\n })\n const queryStr = queryArr.join('&')\n\n // 拼接到 url\n if (urlWithoutHash.indexOf('?') > 0) {\n // 已有 query\n urlWithoutHash = `${urlWithoutHash}&${queryStr}`\n } else {\n // 没有 query\n urlWithoutHash = `${urlWithoutHash}?${queryStr}`\n }\n\n // 返回拼接好的 url\n if (hash) {\n return `${urlWithoutHash}#${hash}`\n }\n return urlWithoutHash\n\n}\n\n/**\n * 替换 html 特殊字符,如 > 替换为 &gt;\n * @param str html str\n */\nexport function replaceHtmlSpecialSymbols(str: string) {\n return (\n str\n /**\n * 遇到两个空格时才替换,一个空格不替换\n * 两个英文单词之间有一个空格,就不用替换,否则无法默认换行 issue #4403\n */\n .replace(/ {2}/g, ' &nbsp;')\n\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/®/g, '&reg;')\n .replace(/©/g, '&copy;')\n .replace(/™/g, '&trade;')\n )\n}\n\n/**\n *【反转】替换 html 特殊字符,如 &gt; 替换为 >\n * @param str html str\n */\nexport function deReplaceHtmlSpecialSymbols(str: string) {\n return str\n .replace(/&nbsp;/g, ' ')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&reg;/g, '®')\n .replace(/&copy;/g, '©')\n .replace(/&trade;/g, '™')\n .replace(/&quot;/g, '\"')\n}\n\nexport const toString = (val: unknown): string => Object.prototype.toString.call(val)\n","/**\n * @description create default uppy uploader\n * @author wangfupeng\n */\n\n// @ts-ignore Uppy v5 types are not resolvable under current TS moduleResolution=node\nimport Uppy from '@uppy/core'\n// @ts-ignore Uppy v5 types are not resolvable under current TS moduleResolution=node\nimport XHRUpload from '@uppy/xhr-upload'\n\nimport { addQueryToUrl } from '../utils/util'\nimport type {\n IUploadConfig, IUploader, IUploadHeaders, IUploadResultFile,\n} from './interface'\n\nfunction getUploadResultFile(file?: IUploadResultFile | null): IUploadResultFile {\n if (file) { return file }\n\n return { name: '' }\n}\n\nfunction normalizeHeaderValues(headers: IUploadHeaders): Record<string, string> {\n return Object.keys(headers).reduce<Record<string, string>>((res, key) => {\n res[key] = String(headers[key])\n return res\n }, {})\n}\n\nfunction normalizeHeaders(\n headers: IUploadConfig['headers'],\n): Record<string, string> | ((file: unknown) => Record<string, string>) | undefined {\n if (!headers) { return undefined }\n\n if (typeof headers === 'function') {\n return file => normalizeHeaderValues(headers(file as IUploadResultFile))\n }\n\n return normalizeHeaderValues(headers)\n}\n\nfunction ensureAbortSignalAny() {\n if (typeof AbortSignal === 'undefined') { return }\n\n const abortSignal = AbortSignal as typeof AbortSignal & {\n any?: (signals: AbortSignal[]) => AbortSignal\n }\n\n if (typeof abortSignal.any === 'function') { return }\n\n abortSignal.any = (signals: AbortSignal[]) => {\n const controller = new AbortController()\n\n const onAbort = (event: Event) => {\n signals.forEach(signal => signal.removeEventListener('abort', onAbort))\n const target = event.target as AbortSignal\n const reason = (target as AbortSignal & { reason?: unknown }).reason\n\n controller.abort(reason)\n }\n\n for (const signal of signals) {\n if (signal.aborted) {\n const reason = (signal as AbortSignal & { reason?: unknown }).reason\n\n controller.abort(reason)\n return controller.signal\n }\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n return controller.signal\n }\n}\n\nfunction createUppyUploader(config: IUploadConfig): IUploader {\n const {\n server = '',\n fieldName = '',\n maxFileSize = 10 * 1024 * 1024, // 10M\n maxNumberOfFiles = 100, // 最多多少个文件\n meta = {},\n metaWithUrl = false,\n headers = {},\n withCredentials = false,\n timeout = 10 * 1000, // 10s\n onBeforeUpload = files => files,\n onSuccess = (_file, _res) => {\n /* on success */\n },\n onError = (file, err, res?) => {\n console.error(`${file.name} upload error`, err, res)\n },\n onProgress = _progress => {\n /* on progress */\n },\n } = config\n\n if (!server) {\n throw new Error('Cannot get upload server address\\n没有配置上传地址')\n }\n if (!fieldName) {\n throw new Error('Cannot get fieldName\\n没有配置 fieldName')\n }\n\n let url = server\n\n if (metaWithUrl) {\n url = addQueryToUrl(url, meta)\n }\n\n ensureAbortSignalAny()\n const normalizedHeaders = normalizeHeaders(headers)\n\n const uppy = new Uppy({\n onBeforeUpload: files => onBeforeUpload(files) as any,\n restrictions: {\n maxFileSize,\n maxNumberOfFiles,\n },\n meta,\n ...config.uppyConfig,\n }).use(XHRUpload, {\n endpoint: url,\n headers: normalizedHeaders,\n formData: true,\n fieldName,\n bundle: false,\n withCredentials,\n timeout,\n ...config.xhrConfig,\n })\n\n uppy.on('upload-success', (file, response) => {\n const { body = {} } = response ?? {}\n const uploadFile = getUploadResultFile(file as IUploadResultFile | undefined)\n\n try {\n onSuccess(uploadFile, body)\n } catch (err) {\n console.error('wangEditor upload file - onSuccess error', err)\n }\n })\n\n uppy.on('progress', progress => {\n if (progress < 1) { return }\n onProgress(progress)\n })\n\n uppy.on('upload-error', (file, error, response) => {\n const uploadFile = getUploadResultFile(file as IUploadResultFile | undefined)\n\n try {\n onError(uploadFile, error, response)\n } catch (err) {\n console.error('wangEditor upload file - onError error', err)\n }\n })\n\n uppy.on('restriction-failed', (file, error) => {\n const uploadFile = getUploadResultFile(file as IUploadResultFile | undefined)\n\n try {\n onError(uploadFile, error, undefined)\n } catch (err) {\n console.error('wangEditor upload file - onError error', err)\n }\n })\n\n return uppy\n}\n\nexport default createUppyUploader\n","/**\n * @description gen uploader\n * @author wangfupeng\n */\n\nimport type { IDomEditor } from '../editor/interface'\nimport createUppyUploader from './createUppyUploader'\nimport type { IUploadAdapter, IUploadConfig, IUploader } from './interface'\n\ntype IUploadConfigWithAdapter = IUploadConfig & {\n uploadAdapter: IUploadAdapter\n}\ntype IDefaultUploader = IUploader & {\n [key: string]: any\n}\n\nfunction createUploader<T extends IUploadConfig>(\n config: T,\n editor?: IDomEditor,\n): T extends IUploadConfigWithAdapter ? IUploader : IDefaultUploader {\n if (config.uploadAdapter) {\n return config.uploadAdapter({ config, editor }) as T extends IUploadConfigWithAdapter\n ? IUploader\n : IDefaultUploader\n }\n\n return createUppyUploader(config) as T extends IUploadConfigWithAdapter\n ? IUploader\n : IDefaultUploader\n}\n\nexport default createUploader\n"],"names":["addQueryToUrl","url","data","_a","__read","split","initialUrlWithoutHash","hash","urlWithoutHash","queryArr","forEach","val","key","push","concat","queryStr","join","indexOf","getUploadResultFile","file","name","normalizeHeaderValues","headers","Object","keys","reduce","res","String","ensureAbortSignalAny","AbortSignal","abortSignal","any","signals","controller","AbortController","onAbort","event","signal","removeEventListener","reason","target","abort","signals_1","__values","signals_1_1","next","value","aborted","addEventListener","once","createUppyUploader","config","server","_b","fieldName","_c","maxFileSize","_d","maxNumberOfFiles","_e","meta","_f","metaWithUrl","_g","_h","withCredentials","_j","timeout","_k","onBeforeUpload","files","_l","onSuccess","_file","_res","_m","onError","err","console","error","_o","onProgress","_progress","Error","normalizedHeaders","normalizeHeaders","uppy","Uppy","__assign","restrictions","uppyConfig","use","XHRUpload","endpoint","formData","bundle","xhrConfig","on","response","body","uploadFile","progress","undefined","createUploader","editor","uploadAdapter"],"mappings":"2TA4BM,SAAUA,EAAcC,EAAaC,GACnC,IAAAC,yRAAAC,CAAgCH,EAAII,MAAM,KAAI,GAA7CC,EAAqBH,EAAA,GAAEI,OAC1BC,EAAiBF,EAGfG,EAAqB,GAE3BC,EAAQR,EAAM,SAACS,EAAKC,GAClBH,EAASI,KAAK,GAAAC,OAAGF,EAAG,KAAAE,OAAIH,GAC1B,GACA,IAAMI,EAAWN,EAASO,KAAK,KAY/B,OAPER,EAFEA,EAAeS,QAAQ,KAAO,EAEf,GAAAH,OAAGN,EAAc,KAAAM,OAAIC,GAGrB,GAAAD,OAAGN,EAAc,KAAAM,OAAIC,GAIpCR,EACK,GAAAO,OAAGN,EAAc,KAAAM,OAAIP,GAEvBC,CAET,CCxCA,SAASU,EAAoBC,GAC3B,OAAIA,GAEG,CAAEC,KAAM,GACjB,CAEA,SAASC,EAAsBC,GAC7B,OAAOC,OAAOC,KAAKF,GAASG,OAA+B,SAACC,EAAKd,GAE/D,OADAc,EAAId,GAAOe,OAAOL,EAAQV,IACnBc,CACT,EAAG,CAAA,EACL,CAcA,SAASE,IACP,GAA2B,oBAAhBC,YAAX,CAEA,IAAMC,EAAcD,YAIW,mBAApBC,EAAYC,MAEvBD,EAAYC,IAAM,SAACC,WACXC,EAAa,IAAIC,gBAEjBC,EAAU,SAACC,GACfJ,EAAQtB,QAAQ,SAAA2B,GAAU,OAAAA,EAAOC,oBAAoB,QAASH,EAApC,GAC1B,IACMI,EADSH,EAAMI,OACyCD,OAE9DN,EAAWQ,MAAMF,EACnB,MAEA,IAAqB,IAAAG,2SAAAC,CAAAX,GAAOY,EAAAF,EAAAG,0BAAE,CAAzB,IAAMR,EAAMO,EAAAE,MACf,GAAIT,EAAOU,QAAS,CAClB,IAAMR,EAAUF,EAA8CE,OAG9D,OADAN,EAAWQ,MAAMF,GACVN,EAAWI,MACpB,CACAA,EAAOW,iBAAiB,QAASb,EAAS,CAAEc,MAAM,GACpD,mGAEA,OAAOhB,EAAWI,MACpB,EA9BiD,CA+BnD,CAEA,SAASa,EAAmBC,GAExB,IAAAhD,EAmBEgD,EAAMC,OAnBRA,OAAM,IAAAjD,EAAG,GAAEA,EACXkD,EAkBEF,EAAMG,UAlBRA,OAAS,IAAAD,EAAG,GAAEA,EACdE,EAiBEJ,EAAMK,YAjBRA,OAAW,IAAAD,EAAG,SAAgBA,EAC9BE,EAgBEN,EAAMO,iBAhBRA,OAAgB,IAAAD,EAAG,IAAGA,EACtBE,EAeER,EAAMS,KAfRA,aAAO,CAAA,EAAED,EACTE,EAcEV,cAdFW,cAAmBD,EACnBE,EAaEZ,UAbF7B,aAAU,CAAA,EAAEyC,EACZC,EAYEb,EAAMc,gBAZRA,OAAe,IAAAD,KACfE,EAWEf,EAAMgB,QAXRA,OAAO,IAAAD,EAAG,IAASA,EACnBE,EAUEjB,EAAMkB,eAVRA,aAAiB,SAAAC,GAAS,OAAAA,CAAA,EAAKF,EAC/BG,EASEpB,YATFqB,aAAY,SAACC,EAAOC,GAClB,EACDH,EACDI,EAMExB,EAAMyB,QANRA,OAAO,IAAAD,EAAG,SAACxD,EAAM0D,EAAKnD,GACpBoD,QAAQC,MAAM,GAAAjE,OAAGK,EAAKC,KAAI,iBAAiByD,EAAKnD,EAClD,EAACiD,EACDK,EAGE7B,aAHF8B,OAAU,IAAAD,EAAG,SAAAE,GACX,IAIJ,IAAK9B,EACH,MAAM,IAAI+B,MAAM,8CAElB,IAAK7B,EACH,MAAM,IAAI6B,MAAM,wCAGlB,IAAIlF,EAAMmD,EAENU,IACF7D,EAAMD,EAAcC,EAAK2D,IAG3BhC,IACA,IAAMwD,EAnFR,SACE9D,GAEA,GAAKA,EAEL,MAAuB,mBAAZA,EACF,SAAAH,GAAQ,OAAAE,EAAsBC,EAAQH,GAA9B,EAGVE,EAAsBC,EAC/B,CAyE4B+D,CAAiB/D,GAErCgE,EAAO,IAAIC,EAAIC,EAAA,CACnBnB,eAAgB,SAAAC,GAAS,OAAAD,EAAeC,EAAf,EACzBmB,aAAc,CACZjC,YAAWA,EACXE,iBAAgBA,GAElBE,KAAIA,GACDT,EAAOuC,aACTC,IAAIC,KACLC,SAAU5F,EACVqB,QAAS8D,EACTU,UAAU,EACVxC,YACAyC,QAAQ,EACR9B,gBAAeA,EACfE,QAAOA,GACJhB,EAAO6C,YAuCZ,OApCAV,EAAKW,GAAG,iBAAkB,SAAC9E,EAAM+E,GACvB,IAAA/F,GAAc+F,QAAAA,EAAY,CAAA,QAA1BC,OAAI,IAAAhG,EAAG,CAAA,IACTiG,EAAalF,EAAoBC,GAEvC,IACEqD,EAAU4B,EAAYD,EACxB,CAAE,MAAOtB,GACPC,QAAQC,MAAM,2CAA4CF,EAC5D,CACF,GAEAS,EAAKW,GAAG,WAAY,SAAAI,GACdA,EAAW,GACfpB,EAAWoB,EACb,GAEAf,EAAKW,GAAG,eAAgB,SAAC9E,EAAM4D,EAAOmB,GACpC,IAAME,EAAalF,EAAoBC,GAEvC,IACEyD,EAAQwB,EAAYrB,EAAOmB,EAC7B,CAAE,MAAOrB,GACPC,QAAQC,MAAM,yCAA0CF,EAC1D,CACF,GAEAS,EAAKW,GAAG,qBAAsB,SAAC9E,EAAM4D,GACnC,IAAMqB,EAAalF,EAAoBC,GAEvC,IACEyD,EAAQwB,EAAYrB,OAAOuB,EAC7B,CAAE,MAAOzB,GACPC,QAAQC,MAAM,yCAA0CF,EAC1D,CACF,GAEOS,CACT,CCzJA,SAASiB,EACPpD,EACAqD,GAEA,OAAIrD,EAAOsD,cACFtD,EAAOsD,cAAc,CAAEtD,OAAMA,EAAEqD,OAAMA,IAKvCtD,EAAmBC,EAG5B"}
1
+ {"version":3,"file":"upload.mjs","names":["forEach","nanoid","genRandomStr","prefix","promiseResolveThen","fn","Promise","resolve","then","addQueryToUrl","url","data","initialUrlWithoutHash","hash","split","urlWithoutHash","queryArr","val","key","push","queryStr","join","indexOf","replaceHtmlSpecialSymbols","str","replace","deReplaceHtmlSpecialSymbols","toString","Object","prototype","call","Uppy","XHRUpload","addQueryToUrl","getUploadResultFile","file","name","normalizeHeaderValues","headers","Object","keys","reduce","res","key","String","normalizeHeaders","undefined","ensureAbortSignalAny","AbortSignal","abortSignal","any","signals","controller","AbortController","onAbort","event","forEach","signal","removeEventListener","target","reason","abort","aborted","addEventListener","once","createUppyUploader","config","server","fieldName","maxFileSize","maxNumberOfFiles","meta","metaWithUrl","withCredentials","timeout","onBeforeUpload","files","onSuccess","_file","_res","onError","err","console","error","onProgress","_progress","Error","url","normalizedHeaders","uppy","restrictions","uppyConfig","use","endpoint","formData","bundle","xhrConfig","on","response","body","uploadFile","progress","createUppyUploader","createUploader","config","editor","uploadAdapter","createUploader","createUppyUploader"],"sources":["../src/utils/util.ts","../src/upload/createUppyUploader.ts","../src/upload/createUploader.ts","../src/upload/index.ts"],"sourcesContent":["/**\n * @description 工具函数\n * @author wangfupeng\n */\n\nimport forEach from 'lodash.foreach'\nimport { nanoid } from 'nanoid'\n\ntype PromiseCallback = (value: void) => void | PromiseLike<void>\n\n/**\n * 获取随机数字符串\n * @param prefix 前缀\n * @returns 随机数字符串\n */\nexport function genRandomStr(prefix: string = 'r'): string {\n return `${prefix}-${nanoid()}`\n}\n\nexport function promiseResolveThen(fn: Function) {\n Promise.resolve().then(fn as PromiseCallback)\n}\n\n/**\n * 追加 url query 参数\n * @param url url\n * @param data data\n */\nexport function addQueryToUrl(url: string, data: object): string {\n const [initialUrlWithoutHash, hash] = url.split('#')\n let urlWithoutHash = initialUrlWithoutHash\n\n // 拼接 query string\n const queryArr: string[] = []\n\n forEach(data, (val, key) => {\n queryArr.push(`${key}=${val}`)\n })\n const queryStr = queryArr.join('&')\n\n // 拼接到 url\n if (urlWithoutHash.indexOf('?') > 0) {\n // 已有 query\n urlWithoutHash = `${urlWithoutHash}&${queryStr}`\n } else {\n // 没有 query\n urlWithoutHash = `${urlWithoutHash}?${queryStr}`\n }\n\n // 返回拼接好的 url\n if (hash) {\n return `${urlWithoutHash}#${hash}`\n }\n return urlWithoutHash\n\n}\n\n/**\n * 替换 html 特殊字符,如 > 替换为 &gt;\n * @param str html str\n */\nexport function replaceHtmlSpecialSymbols(str: string) {\n return (\n str\n /**\n * 遇到两个空格时才替换,一个空格不替换\n * 两个英文单词之间有一个空格,就不用替换,否则无法默认换行 issue #4403\n */\n .replace(/ {2}/g, ' &nbsp;')\n\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/®/g, '&reg;')\n .replace(/©/g, '&copy;')\n .replace(/™/g, '&trade;')\n )\n}\n\n/**\n *【反转】替换 html 特殊字符,如 &gt; 替换为 >\n * @param str html str\n */\nexport function deReplaceHtmlSpecialSymbols(str: string) {\n return str\n .replace(/&nbsp;/g, ' ')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&reg;/g, '®')\n .replace(/&copy;/g, '©')\n .replace(/&trade;/g, '™')\n .replace(/&quot;/g, '\"')\n}\n\nexport const toString = (val: unknown): string => Object.prototype.toString.call(val)\n","/**\n * @description create default uppy uploader\n * @author wangfupeng\n */\n\n// @ts-ignore Uppy v5 types are not resolvable under current TS moduleResolution=node\nimport Uppy from '@uppy/core'\n// @ts-ignore Uppy v5 types are not resolvable under current TS moduleResolution=node\nimport XHRUpload from '@uppy/xhr-upload'\n\nimport { addQueryToUrl } from '../utils/util'\nimport type {\n IUploadConfig, IUploader, IUploadHeaders, IUploadResultFile,\n} from './interface'\n\nfunction getUploadResultFile(file?: IUploadResultFile | null): IUploadResultFile {\n if (file) { return file }\n\n return { name: '' }\n}\n\nfunction normalizeHeaderValues(headers: IUploadHeaders): Record<string, string> {\n return Object.keys(headers).reduce<Record<string, string>>((res, key) => {\n res[key] = String(headers[key])\n return res\n }, {})\n}\n\nfunction normalizeHeaders(\n headers: IUploadConfig['headers'],\n): Record<string, string> | ((file: unknown) => Record<string, string>) | undefined {\n if (!headers) { return undefined }\n\n if (typeof headers === 'function') {\n return file => normalizeHeaderValues(headers(file as IUploadResultFile))\n }\n\n return normalizeHeaderValues(headers)\n}\n\nfunction ensureAbortSignalAny() {\n if (typeof AbortSignal === 'undefined') { return }\n\n const abortSignal = AbortSignal as typeof AbortSignal & {\n any?: (signals: AbortSignal[]) => AbortSignal\n }\n\n if (typeof abortSignal.any === 'function') { return }\n\n abortSignal.any = (signals: AbortSignal[]) => {\n const controller = new AbortController()\n\n const onAbort = (event: Event) => {\n signals.forEach(signal => signal.removeEventListener('abort', onAbort))\n const target = event.target as AbortSignal\n const reason = (target as AbortSignal & { reason?: unknown }).reason\n\n controller.abort(reason)\n }\n\n for (const signal of signals) {\n if (signal.aborted) {\n const reason = (signal as AbortSignal & { reason?: unknown }).reason\n\n controller.abort(reason)\n return controller.signal\n }\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n return controller.signal\n }\n}\n\nfunction createUppyUploader(config: IUploadConfig): IUploader {\n const {\n server = '',\n fieldName = '',\n maxFileSize = 10 * 1024 * 1024, // 10M\n maxNumberOfFiles = 100, // 最多多少个文件\n meta = {},\n metaWithUrl = false,\n headers = {},\n withCredentials = false,\n timeout = 10 * 1000, // 10s\n onBeforeUpload = files => files,\n onSuccess = (_file, _res) => {\n /* on success */\n },\n onError = (file, err, res?) => {\n console.error(`${file.name} upload error`, err, res)\n },\n onProgress = _progress => {\n /* on progress */\n },\n } = config\n\n if (!server) {\n throw new Error('Cannot get upload server address\\n没有配置上传地址')\n }\n if (!fieldName) {\n throw new Error('Cannot get fieldName\\n没有配置 fieldName')\n }\n\n let url = server\n\n if (metaWithUrl) {\n url = addQueryToUrl(url, meta)\n }\n\n ensureAbortSignalAny()\n const normalizedHeaders = normalizeHeaders(headers)\n\n const uppy = new Uppy({\n onBeforeUpload: files => onBeforeUpload(files) as any,\n restrictions: {\n maxFileSize,\n maxNumberOfFiles,\n },\n meta,\n ...config.uppyConfig,\n }).use(XHRUpload, {\n endpoint: url,\n headers: normalizedHeaders,\n formData: true,\n fieldName,\n bundle: false,\n withCredentials,\n timeout,\n ...config.xhrConfig,\n })\n\n uppy.on('upload-success', (file, response) => {\n const { body = {} } = response ?? {}\n const uploadFile = getUploadResultFile(file as IUploadResultFile | undefined)\n\n try {\n onSuccess(uploadFile, body)\n } catch (err) {\n console.error('wangEditor upload file - onSuccess error', err)\n }\n })\n\n uppy.on('progress', progress => {\n if (progress < 1) { return }\n onProgress(progress)\n })\n\n uppy.on('upload-error', (file, error, response) => {\n const uploadFile = getUploadResultFile(file as IUploadResultFile | undefined)\n\n try {\n onError(uploadFile, error, response)\n } catch (err) {\n console.error('wangEditor upload file - onError error', err)\n }\n })\n\n uppy.on('restriction-failed', (file, error) => {\n const uploadFile = getUploadResultFile(file as IUploadResultFile | undefined)\n\n try {\n onError(uploadFile, error, undefined)\n } catch (err) {\n console.error('wangEditor upload file - onError error', err)\n }\n })\n\n return uppy\n}\n\nexport default createUppyUploader\n","/**\n * @description gen uploader\n * @author wangfupeng\n */\n\nimport type { IDomEditor } from '../editor/interface'\nimport createUppyUploader from './createUppyUploader'\nimport type { IUploadAdapter, IUploadConfig, IUploader } from './interface'\n\ntype IUploadConfigWithAdapter = IUploadConfig & {\n uploadAdapter: IUploadAdapter\n}\ntype IDefaultUploader = IUploader & {\n [key: string]: any\n}\n\nfunction createUploader<T extends IUploadConfig>(\n config: T,\n editor?: IDomEditor,\n): T extends IUploadConfigWithAdapter ? IUploader : IDefaultUploader {\n if (config.uploadAdapter) {\n return config.uploadAdapter({ config, editor }) as T extends IUploadConfigWithAdapter\n ? IUploader\n : IDefaultUploader\n }\n\n return createUppyUploader(config) as T extends IUploadConfigWithAdapter\n ? IUploader\n : IDefaultUploader\n}\n\nexport default createUploader\n","/**\n * @description upload entry\n * @author wangfupeng\n */\n\nimport createUploader from './createUploader'\nimport createUppyUploader from './createUppyUploader'\nimport type {\n IUploadAdapter,\n IUploadAdapterContext,\n IUploadConfig,\n IUploader,\n IUploadFile,\n IUploadResultFile,\n} from './interface'\n\nexport { createUploader, createUppyUploader }\nexport type {\n IUploadAdapter,\n IUploadAdapterContext,\n IUploadConfig,\n IUploader,\n IUploadFile,\n IUploadResultFile,\n}\n\n// TODO upload 能力,写到文档中,二次开发使用\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@wangeditor-next/core",
3
- "version": "6.4.1",
3
+ "version": "6.4.3",
4
4
  "description": "wangEditor core",
5
5
  "author": "cycleccc <2991205548@qq.com>",
6
6
  "type": "module",
7
7
  "homepage": "https://github.com/wangeditor-next/wangEditor-next#readme",
8
8
  "license": "MIT",
9
- "types": "dist/core/src/index.d.ts",
9
+ "types": "dist/index.d.ts",
10
10
  "typesVersions": {
11
11
  "*": {
12
12
  "upload": [
13
- "dist/core/src/upload.d.ts"
13
+ "dist/upload.d.ts"
14
14
  ]
15
15
  }
16
16
  },
@@ -18,12 +18,12 @@
18
18
  "module": "dist/index.mjs",
19
19
  "exports": {
20
20
  ".": {
21
- "types": "./dist/core/src/index.d.ts",
21
+ "types": "./dist/index.d.ts",
22
22
  "import": "./dist/index.mjs",
23
23
  "require": "./dist/index.js"
24
24
  },
25
25
  "./upload": {
26
- "types": "./dist/core/src/upload.d.ts",
26
+ "types": "./dist/upload.d.ts",
27
27
  "import": "./dist/upload.mjs",
28
28
  "require": "./dist/upload.js"
29
29
  },
@@ -72,16 +72,15 @@
72
72
  "devDependencies": {
73
73
  "@uppy/core": "^2.1.1",
74
74
  "@uppy/xhr-upload": "^2.0.3",
75
- "@types/is-hotkey": "^0.1.2",
76
- "@wangeditor-next-shared/rollup-config": "^0.0.2"
75
+ "@types/is-hotkey": "^0.1.2"
77
76
  },
78
77
  "scripts": {
79
78
  "test": "vitest run",
80
79
  "test-c": "vitest run --coverage",
81
- "dev": "cross-env NODE_ENV=development rollup -c rollup.config.js",
82
- "dev-watch": "cross-env NODE_ENV=development rollup -c rollup.config.js -w",
83
- "build": "cross-env NODE_ENV=production rollup -c rollup.config.js",
84
- "dev-size-stats": "cross-env NODE_ENV=development:size_stats rollup -c rollup.config.js",
85
- "size-stats": "cross-env NODE_ENV=production:size_stats rollup -c rollup.config.js"
80
+ "dev": "cross-env NODE_ENV=development tsdown -c tsdown.config.js",
81
+ "dev-watch": "cross-env NODE_ENV=development tsdown -c tsdown.config.js -w",
82
+ "build": "cross-env NODE_ENV=production tsdown -c tsdown.config.js -F WangEditorCore && cross-env NODE_ENV=production tsdown -c tsdown.config.js -F WangEditorCoreUpload --no-clean && node ../../scripts/cleanup-tsdown-css.mjs",
83
+ "dev-size-stats": "cross-env NODE_ENV=development:size_stats tsdown -c tsdown.config.js --report",
84
+ "size-stats": "cross-env NODE_ENV=production:size_stats tsdown -c tsdown.config.js --report"
86
85
  }
87
86
  }
@@ -1,13 +0,0 @@
1
- /**
2
- * @description editor config
3
- * @author wangfupeng
4
- */
5
- import { IEditorConfig, IToolbarConfig } from './interface';
6
- /**
7
- * 生成编辑器默认配置
8
- */
9
- export declare function genEditorConfig(userConfig?: Partial<IEditorConfig>): IEditorConfig;
10
- /**
11
- * 生成 toolbar 默认配置
12
- */
13
- export declare function genToolbarConfig(userConfig?: Partial<IToolbarConfig>): IToolbarConfig;
@@ -1,317 +0,0 @@
1
- /**
2
- * @description config interface
3
- * @author wangfupeng
4
- */
5
- import type { Descendant, Node, NodeEntry, Range } from 'slate';
6
- import type { IDomEditor } from '../editor/interface';
7
- import type { IMenuGroup } from '../menus/interface';
8
- import type { IUploadConfig } from '../upload/interface';
9
- import type { DOMElement } from '../utils/dom';
10
- type EmptyText = {
11
- text: '';
12
- };
13
- type ImageElement = {
14
- type: 'image';
15
- src: string;
16
- alt?: string;
17
- href?: string;
18
- width?: string;
19
- height?: string;
20
- style?: {
21
- width?: string;
22
- height?: string;
23
- };
24
- children: EmptyText[];
25
- };
26
- type VideoElement = {
27
- type: 'video';
28
- key?: string;
29
- src: string;
30
- poster?: string;
31
- align?: 'left' | 'center' | 'right';
32
- width?: string;
33
- height?: string;
34
- style?: {
35
- width?: string;
36
- height?: string;
37
- };
38
- children: EmptyText[];
39
- };
40
- interface IHoverbarConf {
41
- [key: string]: {
42
- match?: (editor: IDomEditor, n: Node) => boolean;
43
- menuKeys: string[];
44
- };
45
- }
46
- export type AlertType = 'success' | 'info' | 'warning' | 'error';
47
- export type TextStyleMode = 'inline' | 'class';
48
- export type ClassStylePolicy = 'preserve-data' | 'fallback-inline' | 'strict';
49
- export type TableWidthExportMode = 'adaptive' | 'explicit';
50
- export type StyleClassTokenType = 'color' | 'bgColor' | 'fontSize' | 'fontFamily' | 'textAlign' | 'lineHeight' | 'indent';
51
- export interface IClassStyleUnsupportedPayload {
52
- type: string;
53
- value: string;
54
- scene: 'render' | 'toHtml';
55
- fallback: 'preserve-data' | 'inline' | 'throw';
56
- message: string;
57
- }
58
- /**
59
- * EditorEvents 包含所有编辑器的生命周期事件。
60
- *
61
- * @property {string} CREATED - 编辑器创建后触发,用于初始化操作。
62
- * @property {string} DESTROYED - 编辑器销毁时触发,用于清理操作。
63
- * @property {string} CHANGE - 编辑器内容发生变化时触发,通常用于监听输入或变动。
64
- * @property {string} SCROLL - 编辑器滚动时触发,用于同步滚动状态或执行相关操作。
65
- * @property {string} FULLSCREEN - 编辑器进入全屏时触发,通常用于调整布局或容器尺寸。
66
- * @property {string} UNFULLSCREEN - 编辑器退出全屏时触发,恢复原始布局状态。
67
- * @property {string} MODALORPANELSHOW - 弹窗或面板显示时触发,用于执行相关操作。
68
- * @property {string} MODALORPANELHIDE - 弹窗或面板隐藏时触发,用于执行相关操作。
69
- */
70
- export declare const EditorEvents: {
71
- readonly CREATED: "created";
72
- readonly DESTROYED: "destroyed";
73
- readonly CHANGE: "change";
74
- readonly SCROLL: "scroll";
75
- readonly FULLSCREEN: "fullscreen";
76
- readonly UNFULLSCREEN: "unFullScreen";
77
- readonly MODALORPANELSHOW: "modalOrPanelShow";
78
- readonly MODALORPANELHIDE: "modalOrPanelHide";
79
- };
80
- export type EditorEventType = typeof EditorEvents[keyof typeof EditorEvents];
81
- export interface ISingleMenuConfig {
82
- [key: string]: any;
83
- iconSvg?: string;
84
- }
85
- interface IColorConfig {
86
- colors: string[];
87
- }
88
- interface IFontSizeItem {
89
- name: string;
90
- value: string;
91
- }
92
- interface IFontSizeConfig {
93
- fontSizeList: (string | IFontSizeItem)[];
94
- }
95
- interface IFontFamilyItem {
96
- name: string;
97
- value: string;
98
- }
99
- interface IFontFamilyConfig {
100
- fontFamilyList: (string | IFontFamilyItem)[];
101
- }
102
- interface ILineHeightConfig {
103
- lineHeightList: string[];
104
- }
105
- interface IImageMenuBaseConfig {
106
- checkImage?: (src: string, alt: string, url: string) => boolean | undefined | string;
107
- parseImageSrc?: (src: string) => string;
108
- }
109
- interface IInsertImageConfig extends IImageMenuBaseConfig {
110
- onInsertedImage?: (imageNode: ImageElement | null) => void;
111
- }
112
- interface IEditImageConfig extends IImageMenuBaseConfig {
113
- onUpdatedImage?: (imageNode: ImageElement | null) => void;
114
- }
115
- interface IEmotionConfig {
116
- emotions: string[];
117
- }
118
- interface IInsertTableConfig {
119
- minWidth: number;
120
- minRowHeight: number;
121
- tableHeader: {
122
- selected: boolean;
123
- };
124
- tableFullWidth: {
125
- selected: boolean;
126
- };
127
- widthExportMode: TableWidthExportMode;
128
- }
129
- interface IInsertTableColConfig {
130
- insertPosition: 'before' | 'after';
131
- }
132
- interface ILinkConfig {
133
- checkLink: (text: string, url: string) => string | boolean | undefined;
134
- parseLinkUrl: (url: string) => string;
135
- }
136
- interface IInsertVideoConfig {
137
- onInsertedVideo: (videoNode: VideoElement) => NodeEntry | Range;
138
- checkVideo: (src: string, poster: string) => string | boolean | undefined;
139
- parseVideoSrc: (url: string) => string;
140
- }
141
- export type IUploadVideoConfig = IUploadConfig;
142
- export type IUploadImageConfig = IUploadConfig & {
143
- base64LimitSize: number;
144
- };
145
- interface ICodeLangConfig {
146
- codeLangs: {
147
- text: string;
148
- value: string;
149
- selected?: boolean;
150
- }[];
151
- }
152
- interface ICodeBlockConfig {
153
- showCopyButton?: boolean;
154
- }
155
- export interface IMenuConfig {
156
- bold: ISingleMenuConfig;
157
- underline: ISingleMenuConfig;
158
- wavyUnderline: ISingleMenuConfig;
159
- emphasisDot: ISingleMenuConfig;
160
- italic: ISingleMenuConfig;
161
- through: ISingleMenuConfig;
162
- code: ISingleMenuConfig;
163
- sub: ISingleMenuConfig;
164
- sup: ISingleMenuConfig;
165
- clearStyle: ISingleMenuConfig;
166
- color: IColorConfig;
167
- bgColor: IColorConfig;
168
- fontSize: IFontSizeConfig;
169
- fontFamily: IFontFamilyConfig;
170
- indent: ISingleMenuConfig;
171
- delIndent: ISingleMenuConfig;
172
- justifyLeft: ISingleMenuConfig;
173
- justifyRight: ISingleMenuConfig;
174
- justifyCenter: ISingleMenuConfig;
175
- justifyJustify: ISingleMenuConfig;
176
- lineHeight: ILineHeightConfig;
177
- insertImage: IInsertImageConfig;
178
- deleteImage: ISingleMenuConfig;
179
- editImage: IEditImageConfig;
180
- previewImage: ISingleMenuConfig;
181
- viewImageLink: ISingleMenuConfig;
182
- imageWidth30: ISingleMenuConfig;
183
- imageWidth50: ISingleMenuConfig;
184
- imageWidth100: ISingleMenuConfig;
185
- editorImageSizeMenu: ISingleMenuConfig;
186
- divider: ISingleMenuConfig;
187
- emotion: IEmotionConfig;
188
- insertLink: ILinkConfig;
189
- editLink: ILinkConfig;
190
- unLink: ISingleMenuConfig;
191
- viewLink: ISingleMenuConfig;
192
- codeBlock: ICodeBlockConfig;
193
- blockquote: ISingleMenuConfig;
194
- headerSelect: ISingleMenuConfig;
195
- header1: ISingleMenuConfig;
196
- header2: ISingleMenuConfig;
197
- header3: ISingleMenuConfig;
198
- header4: ISingleMenuConfig;
199
- header5: ISingleMenuConfig;
200
- header6: ISingleMenuConfig;
201
- todo: ISingleMenuConfig;
202
- formatPainter: ISingleMenuConfig;
203
- redo: ISingleMenuConfig;
204
- undo: ISingleMenuConfig;
205
- fullScreen: ISingleMenuConfig;
206
- enter: ISingleMenuConfig;
207
- bulletedList: ISingleMenuConfig;
208
- numberedList: ISingleMenuConfig;
209
- numberedListLowerAlpha: ISingleMenuConfig;
210
- insertTable: ISingleMenuConfig;
211
- deleteTable: ISingleMenuConfig;
212
- insertTableRow: IInsertTableConfig;
213
- deleteTableRow: ISingleMenuConfig;
214
- insertTableCol: IInsertTableColConfig;
215
- deleteTableCol: ISingleMenuConfig;
216
- tableHeader: ISingleMenuConfig;
217
- tableFullWidth: ISingleMenuConfig;
218
- mergeTableCell: ISingleMenuConfig;
219
- splitTableCell: ISingleMenuConfig;
220
- setTableProperty: ISingleMenuConfig;
221
- setTableCellProperty: ISingleMenuConfig;
222
- insertVideo: IInsertVideoConfig;
223
- uploadVideo: IUploadVideoConfig;
224
- editVideoSize: ISingleMenuConfig;
225
- editVideoSrc: ISingleMenuConfig;
226
- uploadImage: IUploadImageConfig;
227
- codeSelectLang: ICodeLangConfig;
228
- }
229
- export type IMenuConfigUpdate = {
230
- [K in keyof IMenuConfig]?: Partial<IMenuConfig[K]>;
231
- };
232
- /**
233
- * editor config
234
- */
235
- export interface IEditorConfig {
236
- customAlert: (info: string, type: AlertType) => void;
237
- onCreated?: (editor: IDomEditor) => void;
238
- onChange?: (editor: IDomEditor) => void;
239
- onDestroyed?: (editor: IDomEditor) => void;
240
- onMaxLength?: (editor: IDomEditor) => void;
241
- onFocus?: (editor: IDomEditor) => void;
242
- onBlur?: (editor: IDomEditor) => void;
243
- /**
244
- * 自定义粘贴。返回 true 则继续粘贴,返回 false 则自行实现粘贴,阻止默认粘贴
245
- */
246
- customPaste?: (editor: IDomEditor, e: ClipboardEvent) => boolean;
247
- /**
248
- * 自定义复制。拦截 event 添加或修改 clipboardData 数据
249
- */
250
- customCopy?: (editor: IDomEditor, e: ClipboardEvent) => void;
251
- /**
252
- * 自定义 HTML 清洗逻辑。在 setHtml / 初始化 html / 默认粘贴 HTML 前执行。
253
- * 返回值会继续进入编辑器的 HTML 解析流程。
254
- */
255
- sanitizeHtml?: (html: string) => string;
256
- /**
257
- * 文本/段落样式(color/bgColor/fontSize/fontFamily/textAlign/lineHeight/indent)导出模式。
258
- * - `inline`: 输出 style 属性(默认)
259
- * - `class`: 输出 class + data-w-e-*,便于严格 CSP 场景使用
260
- */
261
- textStyleMode?: TextStyleMode;
262
- /**
263
- * class 模式遇到“不在受支持样式 token 集合中”的值时的处理策略。
264
- * - `preserve-data`(默认):保留 data-w-e-*,不输出 class/inline,确保可回读但可能不展示
265
- * - `fallback-inline`:回退为 inline style,优先保证展示
266
- * - `strict`:直接抛错,阻止静默降级
267
- */
268
- classStylePolicy?: ClassStylePolicy;
269
- /**
270
- * class 模式遇到未知值时的通知回调。
271
- */
272
- onClassStyleUnsupported?: (payload: IClassStyleUnsupportedPayload) => void;
273
- /**
274
- * class 模式下允许输出 class 的样式 token 注册表。
275
- * 用于扩展默认 token(需配合业务方自行提供对应 CSS)。
276
- */
277
- styleClassTokens?: Partial<Record<StyleClassTokenType, string[]>>;
278
- scroll: boolean;
279
- placeholder?: string;
280
- readOnly: boolean;
281
- autoFocus: boolean;
282
- decorate?: (nodeEntry: NodeEntry) => Range[];
283
- maxLength?: number;
284
- MENU_CONF?: IMenuConfigUpdate;
285
- hoverbarKeys?: IHoverbarConf;
286
- EXTEND_CONF?: any;
287
- skipCacheTypes?: string[];
288
- }
289
- export interface IInsertKeysConfig {
290
- index: number;
291
- keys: string | IToolbarMenuKey[];
292
- replaceFn?: (config: IToolbarMenuKey) => IToolbarMenuKey;
293
- }
294
- export interface IToolbarMenuItemConf {
295
- key: string;
296
- title?: string;
297
- iconSvg?: string;
298
- }
299
- export type IToolbarMenuKey = string | IMenuGroup | IToolbarMenuItemConf;
300
- /**
301
- * toolbar config
302
- */
303
- export interface IToolbarConfig {
304
- toolbarKeys: IToolbarMenuKey[];
305
- insertKeys: IInsertKeysConfig | Array<IInsertKeysConfig>;
306
- excludeKeys: Array<string>;
307
- modalAppendToBody: boolean;
308
- }
309
- type PluginFnType = <T extends IDomEditor>(editor: T) => T;
310
- export interface ICreateOption {
311
- selector: string | DOMElement;
312
- config: Partial<IEditorConfig>;
313
- content?: Descendant[];
314
- html?: string;
315
- plugins: PluginFnType[];
316
- }
317
- export {};
@@ -1,12 +0,0 @@
1
- /**
2
- * @description config register
3
- * @author wangfupeng
4
- */
5
- import { IMenuConfig, ISingleMenuConfig } from '../config/interface';
6
- export declare const GLOBAL_MENU_CONF: Partial<IMenuConfig>;
7
- /**
8
- * 注册全局菜单配置
9
- * @param key menu key
10
- * @param config config
11
- */
12
- export declare function registerGlobalMenuConf(key: string, config?: ISingleMenuConfig): void;
@@ -1,8 +0,0 @@
1
- /**
2
- * @description class/inline style mode helpers
3
- */
4
- import { IDomEditor } from '../editor/interface';
5
- import { ClassStylePolicy, IClassStyleUnsupportedPayload, TextStyleMode } from './interface';
6
- export declare function getTextStyleMode(editor?: IDomEditor): TextStyleMode;
7
- export declare function getClassStylePolicy(editor?: IDomEditor): ClassStylePolicy;
8
- export declare function reportUnsupportedClassStyle(editor: IDomEditor | undefined, payload: IClassStyleUnsupportedPayload): void;
@@ -1 +0,0 @@
1
- export declare const IGNORE_TAGS: Set<string>;
@@ -1,12 +0,0 @@
1
- /**
2
- * @description svg tag
3
- * @author wangfupeng
4
- */
5
- /**
6
- * 【注意】svg 字符串的长度 ,否则会导致代码体积过大
7
- * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293
8
- * 找不到再从 iconfont.com 搜索
9
- */
10
- export declare const SVG_CHECK_MARK = "<svg viewBox=\"0 0 1446 1024\"><path d=\"M574.116299 786.736392 1238.811249 48.517862C1272.390222 11.224635 1329.414799 7.827718 1366.75664 41.450462 1403.840015 74.840484 1406.731043 132.084741 1373.10189 169.433699L655.118888 966.834607C653.072421 969.716875 650.835807 972.514337 648.407938 975.210759 615.017957 1012.29409 558.292155 1015.652019 521.195664 982.250188L72.778218 578.493306C35.910826 545.297758 32.859041 488.584019 66.481825 451.242134 99.871807 414.158803 156.597563 410.800834 193.694055 444.202665L574.116299 786.736392Z\"></path></svg>";
11
- export declare const SVG_DOWN_ARROW = "<svg viewBox=\"0 0 1024 1024\"><path d=\"M498.7 655.8l-197.6-268c-8.1-10.9-0.3-26.4 13.3-26.4h395.2c13.6 0 21.4 15.4 13.3 26.4l-197.6 268c-6.6 9-20 9-26.6 0z\"></path></svg>";
12
- export declare const SVG_CLOSE = "<svg viewBox=\"0 0 1024 1024\"><path d=\"M1024 896.1024l-128 128L512 640 128 1024 0 896 384 512 0 128 128 0 512 384 896.1024 0l128 128L640 512z\"></path></svg>";
@@ -1,15 +0,0 @@
1
- /**
2
- * @description 绑定 node 的关系
3
- * @author wangfupeng
4
- */
5
- import { Ancestor, Node } from 'slate';
6
- import { IDomEditor } from '../editor/interface';
7
- /**
8
- * createEditor 未传递 selector 时,绑定 node 的关系( NODE_TO_PARENT, NODE_TO_INDEX 等 )
9
- * @param node node
10
- * @param index index
11
- * @param parent parent node
12
- * @param editor editor
13
- */
14
- declare function bindNodeRelation(node: Node, index: number, parent: Ancestor, editor: IDomEditor): void;
15
- export default bindNodeRelation;
@@ -1,10 +0,0 @@
1
- /**
2
- * @description create editor
3
- * @author wangfupeng
4
- */
5
- import { ICreateOption } from '../config/interface';
6
- import { IDomEditor } from '../editor/interface';
7
- /**
8
- * 创建编辑器
9
- */
10
- export default function (option: Partial<ICreateOption>): IDomEditor;
@@ -1,14 +0,0 @@
1
- /**
2
- * @description create toolbar
3
- * @author wangfupeng
4
- */
5
- import { IToolbarConfig } from '../config/interface';
6
- import { IDomEditor } from '../editor/interface';
7
- import Toolbar from '../menus/bar/Toolbar';
8
- import { DOMElement } from '../utils/dom';
9
- interface ICreateOption {
10
- selector: string | DOMElement;
11
- config?: Partial<IToolbarConfig>;
12
- }
13
- export default function (editor: IDomEditor | null, option: ICreateOption): Toolbar;
14
- export {};
@@ -1,37 +0,0 @@
1
- /**
2
- * @description create helper
3
- * @author wangfupeng
4
- */
5
- import { Descendant } from 'slate';
6
- import { IDomEditor } from '../editor/interface';
7
- import { DOMElement } from '../utils/dom';
8
- /**
9
- * 检查是否重复创建 textarea
10
- */
11
- export declare function isRepeatedCreateTextarea(editor: IDomEditor, selector: string | DOMElement): boolean;
12
- /**
13
- * 检查是否重复创建 toolbar
14
- */
15
- export declare function isRepeatedCreateToolbar(editor: IDomEditor, selector: string | DOMElement): boolean;
16
- /**
17
- * 生成默认 content
18
- */
19
- export declare function genDefaultContent(): {
20
- type: string;
21
- children: {
22
- text: string;
23
- }[];
24
- }[];
25
- /**
26
- * html 字符串 -> content
27
- * @param editor editor
28
- * @param html html 字符串
29
- */
30
- export declare function htmlToContent(editor: IDomEditor, html?: string): Descendant[];
31
- /**
32
- * 初始化内容(要在 config 和 plugins 后面)
33
- */
34
- export declare function initializeContent(editor: IDomEditor, options: {
35
- html?: string;
36
- content?: Descendant[];
37
- }): void;
@@ -1,8 +0,0 @@
1
- /**
2
- * @description create entry
3
- * @author wangfupeng
4
- */
5
- import coreCreateEditor from './create-editor';
6
- import coreCreateToolbar from './create-toolbar';
7
- import { htmlToContent } from './helper';
8
- export { coreCreateEditor, coreCreateToolbar, htmlToContent };