adtec-core-package 3.0.0 → 3.0.2

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 (508) hide show
  1. package/auto-imports.d.ts +299 -0
  2. package/package.json +93 -49
  3. package/prebuilt/umo-editor/favicon.ico +0 -0
  4. package/prebuilt/umo-editor/umo-editor.css +1 -0
  5. package/prebuilt/umo-editor/umo-editor.js +86138 -0
  6. package/prebuilt/umo-editor/umo-editor.js.map +1 -0
  7. package/scripts/build-umo.mjs +47 -0
  8. package/scripts/generate-umo-entry.mjs +81 -0
  9. package/scripts/inject-umo-composable-imports.mjs +66 -0
  10. package/scripts/patch-es-drager-vue35.mjs +68 -0
  11. package/scripts/patch-tiptap-vue3.mjs +117 -0
  12. package/scripts/prepare-umo-source.mjs +122 -0
  13. package/src/components/RichTextEditor/RichTextEditor.vue +566 -398
  14. package/src/components/RichTextEditor/installUmoEditorApp.ts +31 -0
  15. package/src/components/RichTextEditor/richTextHtmlUtils.ts +151 -17
  16. package/src/components/RichTextEditor/umo-editor.d.ts +9 -0
  17. package/src/components/editor-main/src/assets/icons/align-center.svg +1 -0
  18. package/src/components/editor-main/src/assets/icons/align-distributed.svg +1 -0
  19. package/src/components/editor-main/src/assets/icons/align-justify.svg +1 -0
  20. package/src/components/editor-main/src/assets/icons/align-left.svg +1 -0
  21. package/src/components/editor-main/src/assets/icons/align-right.svg +1 -0
  22. package/src/components/editor-main/src/assets/icons/arrow-down.svg +1 -0
  23. package/src/components/editor-main/src/assets/icons/audio.svg +1 -0
  24. package/src/components/editor-main/src/assets/icons/auto-width.svg +1 -0
  25. package/src/components/editor-main/src/assets/icons/background-color.svg +1 -0
  26. package/src/components/editor-main/src/assets/icons/barcode.svg +1 -0
  27. package/src/components/editor-main/src/assets/icons/block-add.svg +1 -0
  28. package/src/components/editor-main/src/assets/icons/block-menu.svg +1 -0
  29. package/src/components/editor-main/src/assets/icons/bold.svg +1 -0
  30. package/src/components/editor-main/src/assets/icons/bookmark.svg +10 -0
  31. package/src/components/editor-main/src/assets/icons/border-none.svg +1 -0
  32. package/src/components/editor-main/src/assets/icons/border.svg +1 -0
  33. package/src/components/editor-main/src/assets/icons/break-marks.svg +1 -0
  34. package/src/components/editor-main/src/assets/icons/bullet-list-2.svg +1 -0
  35. package/src/components/editor-main/src/assets/icons/bullet-list-circle.svg +1 -0
  36. package/src/components/editor-main/src/assets/icons/bullet-list-disc.svg +1 -0
  37. package/src/components/editor-main/src/assets/icons/bullet-list-square.svg +1 -0
  38. package/src/components/editor-main/src/assets/icons/bullet-list.svg +1 -0
  39. package/src/components/editor-main/src/assets/icons/callout.svg +1 -0
  40. package/src/components/editor-main/src/assets/icons/check.svg +1 -0
  41. package/src/components/editor-main/src/assets/icons/checkbox.svg +1 -0
  42. package/src/components/editor-main/src/assets/icons/chinese-case.svg +1 -0
  43. package/src/components/editor-main/src/assets/icons/clear-cache.svg +1 -0
  44. package/src/components/editor-main/src/assets/icons/clear-format.svg +1 -0
  45. package/src/components/editor-main/src/assets/icons/clickable.svg +1 -0
  46. package/src/components/editor-main/src/assets/icons/close.svg +1 -0
  47. package/src/components/editor-main/src/assets/icons/code-block.svg +1 -0
  48. package/src/components/editor-main/src/assets/icons/code-line-number.svg +1 -0
  49. package/src/components/editor-main/src/assets/icons/code-word-wrap.svg +1 -0
  50. package/src/components/editor-main/src/assets/icons/code.svg +1 -0
  51. package/src/components/editor-main/src/assets/icons/color.svg +1 -0
  52. package/src/components/editor-main/src/assets/icons/columns.svg +1 -0
  53. package/src/components/editor-main/src/assets/icons/copy.svg +1 -0
  54. package/src/components/editor-main/src/assets/icons/copyright.svg +1 -0
  55. package/src/components/editor-main/src/assets/icons/date.svg +1 -0
  56. package/src/components/editor-main/src/assets/icons/details.svg +1 -0
  57. package/src/components/editor-main/src/assets/icons/diagrams.svg +1 -0
  58. package/src/components/editor-main/src/assets/icons/download.svg +1 -0
  59. package/src/components/editor-main/src/assets/icons/echarts.svg +1 -0
  60. package/src/components/editor-main/src/assets/icons/edit.svg +1 -0
  61. package/src/components/editor-main/src/assets/icons/embed.svg +1 -0
  62. package/src/components/editor-main/src/assets/icons/emoji.svg +1 -0
  63. package/src/components/editor-main/src/assets/icons/equal-proportion.svg +1 -0
  64. package/src/components/editor-main/src/assets/icons/exit.svg +1 -0
  65. package/src/components/editor-main/src/assets/icons/expand-down.svg +1 -0
  66. package/src/components/editor-main/src/assets/icons/file-view.svg +1 -0
  67. package/src/components/editor-main/src/assets/icons/file.svg +1 -0
  68. package/src/components/editor-main/src/assets/icons/font-size-decrease.svg +1 -0
  69. package/src/components/editor-main/src/assets/icons/font-size-increase.svg +1 -0
  70. package/src/components/editor-main/src/assets/icons/footnote.svg +1 -0
  71. package/src/components/editor-main/src/assets/icons/format-painter.svg +1 -0
  72. package/src/components/editor-main/src/assets/icons/format.svg +1 -0
  73. package/src/components/editor-main/src/assets/icons/full-screen-exit.svg +1 -0
  74. package/src/components/editor-main/src/assets/icons/full-screen.svg +1 -0
  75. package/src/components/editor-main/src/assets/icons/hand-drawn.svg +1 -0
  76. package/src/components/editor-main/src/assets/icons/hard-break.svg +1 -0
  77. package/src/components/editor-main/src/assets/icons/heading.svg +1 -0
  78. package/src/components/editor-main/src/assets/icons/help.svg +1 -0
  79. package/src/components/editor-main/src/assets/icons/hide-toolbar.svg +1 -0
  80. package/src/components/editor-main/src/assets/icons/highlight.svg +1 -0
  81. package/src/components/editor-main/src/assets/icons/hr.svg +1 -0
  82. package/src/components/editor-main/src/assets/icons/html5.svg +1 -0
  83. package/src/components/editor-main/src/assets/icons/image-draggable.svg +1 -0
  84. package/src/components/editor-main/src/assets/icons/image-failed.svg +1 -0
  85. package/src/components/editor-main/src/assets/icons/image-flip.svg +1 -0
  86. package/src/components/editor-main/src/assets/icons/image-inline.svg +1 -0
  87. package/src/components/editor-main/src/assets/icons/image-preview.svg +1 -0
  88. package/src/components/editor-main/src/assets/icons/image-remove-background.svg +1 -0
  89. package/src/components/editor-main/src/assets/icons/image-reset.svg +1 -0
  90. package/src/components/editor-main/src/assets/icons/image-rotate.svg +1 -0
  91. package/src/components/editor-main/src/assets/icons/image.svg +1 -0
  92. package/src/components/editor-main/src/assets/icons/indent.svg +1 -0
  93. package/src/components/editor-main/src/assets/icons/italic.svg +1 -0
  94. package/src/components/editor-main/src/assets/icons/laser-pointer.svg +1 -0
  95. package/src/components/editor-main/src/assets/icons/layout-page.svg +1 -0
  96. package/src/components/editor-main/src/assets/icons/layout-web.svg +1 -0
  97. package/src/components/editor-main/src/assets/icons/letter-spacing.svg +1 -0
  98. package/src/components/editor-main/src/assets/icons/line-height.svg +1 -0
  99. package/src/components/editor-main/src/assets/icons/line-number.svg +1 -0
  100. package/src/components/editor-main/src/assets/icons/link.svg +1 -0
  101. package/src/components/editor-main/src/assets/icons/loading.svg +1 -0
  102. package/src/components/editor-main/src/assets/icons/locale.svg +1 -0
  103. package/src/components/editor-main/src/assets/icons/margin.svg +1 -0
  104. package/src/components/editor-main/src/assets/icons/markdown.svg +1 -0
  105. package/src/components/editor-main/src/assets/icons/math.svg +1 -0
  106. package/src/components/editor-main/src/assets/icons/mention.svg +1 -0
  107. package/src/components/editor-main/src/assets/icons/menu.svg +1 -0
  108. package/src/components/editor-main/src/assets/icons/mermaid.svg +1 -0
  109. package/src/components/editor-main/src/assets/icons/mind-map.svg +1 -0
  110. package/src/components/editor-main/src/assets/icons/minus.svg +1 -0
  111. package/src/components/editor-main/src/assets/icons/new-window.svg +1 -0
  112. package/src/components/editor-main/src/assets/icons/node-add.svg +1 -0
  113. package/src/components/editor-main/src/assets/icons/node-clear-format.svg +1 -0
  114. package/src/components/editor-main/src/assets/icons/node-copy.svg +1 -0
  115. package/src/components/editor-main/src/assets/icons/node-cut.svg +2 -0
  116. package/src/components/editor-main/src/assets/icons/node-delete-2.svg +1 -0
  117. package/src/components/editor-main/src/assets/icons/node-delete.svg +1 -0
  118. package/src/components/editor-main/src/assets/icons/node-duplicate.svg +1 -0
  119. package/src/components/editor-main/src/assets/icons/node-switch.svg +1 -0
  120. package/src/components/editor-main/src/assets/icons/ordered-list-2.svg +1 -0
  121. package/src/components/editor-main/src/assets/icons/ordered-list-decimal-leading-zero.svg +1 -0
  122. package/src/components/editor-main/src/assets/icons/ordered-list-decimal.svg +1 -0
  123. package/src/components/editor-main/src/assets/icons/ordered-list-lower-latin.svg +1 -0
  124. package/src/components/editor-main/src/assets/icons/ordered-list-lower-roman.svg +1 -0
  125. package/src/components/editor-main/src/assets/icons/ordered-list-simp-chinese-formal.svg +12 -0
  126. package/src/components/editor-main/src/assets/icons/ordered-list-trad-chinese-informal.svg +12 -0
  127. package/src/components/editor-main/src/assets/icons/ordered-list-upper-latin.svg +1 -0
  128. package/src/components/editor-main/src/assets/icons/ordered-list-upper-roman.svg +1 -0
  129. package/src/components/editor-main/src/assets/icons/ordered-list.svg +1 -0
  130. package/src/components/editor-main/src/assets/icons/outdent.svg +1 -0
  131. package/src/components/editor-main/src/assets/icons/page-background.svg +1 -0
  132. package/src/components/editor-main/src/assets/icons/page-break.svg +1 -0
  133. package/src/components/editor-main/src/assets/icons/page-footer.svg +1 -0
  134. package/src/components/editor-main/src/assets/icons/page-header.svg +1 -0
  135. package/src/components/editor-main/src/assets/icons/page-margin.svg +1 -0
  136. package/src/components/editor-main/src/assets/icons/page-orientation.svg +1 -0
  137. package/src/components/editor-main/src/assets/icons/page-size.svg +1 -0
  138. package/src/components/editor-main/src/assets/icons/page.svg +1 -0
  139. package/src/components/editor-main/src/assets/icons/palette-color.svg +1 -0
  140. package/src/components/editor-main/src/assets/icons/paragraph.svg +1 -0
  141. package/src/components/editor-main/src/assets/icons/pdf.svg +1 -0
  142. package/src/components/editor-main/src/assets/icons/plus.svg +1 -0
  143. package/src/components/editor-main/src/assets/icons/preview.svg +1 -0
  144. package/src/components/editor-main/src/assets/icons/print.svg +1 -0
  145. package/src/components/editor-main/src/assets/icons/qrcode.svg +1 -0
  146. package/src/components/editor-main/src/assets/icons/quote.svg +1 -0
  147. package/src/components/editor-main/src/assets/icons/redo.svg +1 -0
  148. package/src/components/editor-main/src/assets/icons/register.js +47 -0
  149. package/src/components/editor-main/src/assets/icons/reload.svg +1 -0
  150. package/src/components/editor-main/src/assets/icons/remove.svg +1 -0
  151. package/src/components/editor-main/src/assets/icons/reply.svg +1 -0
  152. package/src/components/editor-main/src/assets/icons/search-replace.svg +1 -0
  153. package/src/components/editor-main/src/assets/icons/select-all.svg +1 -0
  154. package/src/components/editor-main/src/assets/icons/selected.svg +1 -0
  155. package/src/components/editor-main/src/assets/icons/setting.svg +1 -0
  156. package/src/components/editor-main/src/assets/icons/share.svg +1 -0
  157. package/src/components/editor-main/src/assets/icons/shortcut.svg +1 -0
  158. package/src/components/editor-main/src/assets/icons/signature.svg +1 -0
  159. package/src/components/editor-main/src/assets/icons/skin.svg +1 -0
  160. package/src/components/editor-main/src/assets/icons/spellcheck.svg +1 -0
  161. package/src/components/editor-main/src/assets/icons/strike.svg +1 -0
  162. package/src/components/editor-main/src/assets/icons/subscript.svg +1 -0
  163. package/src/components/editor-main/src/assets/icons/superscript.svg +1 -0
  164. package/src/components/editor-main/src/assets/icons/symbol.svg +1 -0
  165. package/src/components/editor-main/src/assets/icons/table-add-column-after.svg +1 -0
  166. package/src/components/editor-main/src/assets/icons/table-add-column-before.svg +1 -0
  167. package/src/components/editor-main/src/assets/icons/table-add-row-after.svg +1 -0
  168. package/src/components/editor-main/src/assets/icons/table-add-row-before.svg +1 -0
  169. package/src/components/editor-main/src/assets/icons/table-cells-align.svg +1 -0
  170. package/src/components/editor-main/src/assets/icons/table-cells-background.svg +1 -0
  171. package/src/components/editor-main/src/assets/icons/table-delete-column.svg +1 -0
  172. package/src/components/editor-main/src/assets/icons/table-delete-row.svg +1 -0
  173. package/src/components/editor-main/src/assets/icons/table-delete.svg +1 -0
  174. package/src/components/editor-main/src/assets/icons/table-fix.svg +1 -0
  175. package/src/components/editor-main/src/assets/icons/table-header-cell.svg +1 -0
  176. package/src/components/editor-main/src/assets/icons/table-header-column.svg +1 -0
  177. package/src/components/editor-main/src/assets/icons/table-header-row.svg +1 -0
  178. package/src/components/editor-main/src/assets/icons/table-merge-cell.svg +1 -0
  179. package/src/components/editor-main/src/assets/icons/table-next-cell.svg +1 -0
  180. package/src/components/editor-main/src/assets/icons/table-previous-cell.svg +1 -0
  181. package/src/components/editor-main/src/assets/icons/table-split-cell.svg +1 -0
  182. package/src/components/editor-main/src/assets/icons/table.svg +1 -0
  183. package/src/components/editor-main/src/assets/icons/tag.svg +1 -0
  184. package/src/components/editor-main/src/assets/icons/task-list-2.svg +1 -0
  185. package/src/components/editor-main/src/assets/icons/task-list.svg +1 -0
  186. package/src/components/editor-main/src/assets/icons/template.svg +1 -0
  187. package/src/components/editor-main/src/assets/icons/text-box.svg +1 -0
  188. package/src/components/editor-main/src/assets/icons/text.svg +1 -0
  189. package/src/components/editor-main/src/assets/icons/theme.svg +1 -0
  190. package/src/components/editor-main/src/assets/icons/time.svg +1 -0
  191. package/src/components/editor-main/src/assets/icons/toc.svg +1 -0
  192. package/src/components/editor-main/src/assets/icons/toolbar-classic.svg +1 -0
  193. package/src/components/editor-main/src/assets/icons/toolbar-ribbon.svg +1 -0
  194. package/src/components/editor-main/src/assets/icons/toolbar-source.svg +1 -0
  195. package/src/components/editor-main/src/assets/icons/underline.svg +1 -0
  196. package/src/components/editor-main/src/assets/icons/undo.svg +1 -0
  197. package/src/components/editor-main/src/assets/icons/unlink.svg +1 -0
  198. package/src/components/editor-main/src/assets/icons/video.svg +1 -0
  199. package/src/components/editor-main/src/assets/icons/view.svg +1 -0
  200. package/src/components/editor-main/src/assets/icons/watermark.svg +1 -0
  201. package/src/components/editor-main/src/assets/icons/web-page.svg +1 -0
  202. package/src/components/editor-main/src/assets/icons/word-wrap.svg +1 -0
  203. package/src/components/editor-main/src/assets/icons/word.svg +1 -0
  204. package/src/components/editor-main/src/assets/icons/writing-mode.svg +1 -0
  205. package/src/components/editor-main/src/assets/icons/zoom-1.svg +1 -0
  206. package/src/components/editor-main/src/assets/icons/zoom-auto.svg +1 -0
  207. package/src/components/editor-main/src/assets/icons/zoom.svg +1 -0
  208. package/src/components/editor-main/src/assets/images/avatar.svg +1 -0
  209. package/src/components/editor-main/src/assets/images/format-painter.svg +1 -0
  210. package/src/components/editor-main/src/assets/images/laser-pointer.svg +1 -0
  211. package/src/components/editor-main/src/assets/images/logo.svg +1 -0
  212. package/src/components/editor-main/src/assets/images/watermark-compact.png +0 -0
  213. package/src/components/editor-main/src/assets/images/watermark-spacious.png +0 -0
  214. package/src/components/editor-main/src/assets/styles/_mixins.less +150 -0
  215. package/src/components/editor-main/src/assets/styles/_variables.less +97 -0
  216. package/src/components/editor-main/src/assets/styles/drager.less +123 -0
  217. package/src/components/editor-main/src/assets/styles/editor.less +917 -0
  218. package/src/components/editor-main/src/assets/styles/index.less +19 -0
  219. package/src/components/editor-main/src/assets/styles/plyr.less +26 -0
  220. package/src/components/editor-main/src/assets/styles/tdesign.less +341 -0
  221. package/src/components/editor-main/src/components/container/page.vue +392 -0
  222. package/src/components/editor-main/src/components/container/print.vue +191 -0
  223. package/src/components/editor-main/src/components/container/search-replace.vue +264 -0
  224. package/src/components/editor-main/src/components/container/toc.vue +260 -0
  225. package/src/components/editor-main/src/components/editor/index.vue +213 -0
  226. package/src/components/editor-main/src/components/icon.vue +43 -0
  227. package/src/components/editor-main/src/components/index.js +22 -0
  228. package/src/components/editor-main/src/components/index.vue +1396 -0
  229. package/src/components/editor-main/src/components/menus/block/common.vue +127 -0
  230. package/src/components/editor-main/src/components/menus/block/index.vue +217 -0
  231. package/src/components/editor-main/src/components/menus/block/node.vue +183 -0
  232. package/src/components/editor-main/src/components/menus/bubble/callout/background.vue +39 -0
  233. package/src/components/editor-main/src/components/menus/bubble/callout/builtin.vue +90 -0
  234. package/src/components/editor-main/src/components/menus/bubble/callout/emoji-remove.vue +28 -0
  235. package/src/components/editor-main/src/components/menus/bubble/file/download.vue +30 -0
  236. package/src/components/editor-main/src/components/menus/bubble/file/width.vue +22 -0
  237. package/src/components/editor-main/src/components/menus/bubble/image/convert.vue +63 -0
  238. package/src/components/editor-main/src/components/menus/bubble/image/edit.vue +32 -0
  239. package/src/components/editor-main/src/components/menus/bubble/image/open.vue +27 -0
  240. package/src/components/editor-main/src/components/menus/bubble/image/preview.vue +24 -0
  241. package/src/components/editor-main/src/components/menus/bubble/image/proportion.vue +34 -0
  242. package/src/components/editor-main/src/components/menus/bubble/index.vue +55 -0
  243. package/src/components/editor-main/src/components/menus/bubble/link/copy.vue +29 -0
  244. package/src/components/editor-main/src/components/menus/bubble/link/open.vue +27 -0
  245. package/src/components/editor-main/src/components/menus/bubble/link/unlink.vue +19 -0
  246. package/src/components/editor-main/src/components/menus/bubble/math.vue +36 -0
  247. package/src/components/editor-main/src/components/menus/bubble/menus.vue +209 -0
  248. package/src/components/editor-main/src/components/menus/bubble/node/delete.vue +15 -0
  249. package/src/components/editor-main/src/components/menus/bubble/node/duplicate.vue +40 -0
  250. package/src/components/editor-main/src/components/menus/bubble/node/tofile.vue +31 -0
  251. package/src/components/editor-main/src/components/menus/bubble/tag/background.vue +36 -0
  252. package/src/components/editor-main/src/components/menus/bubble/tag/builtin.vue +88 -0
  253. package/src/components/editor-main/src/components/menus/bubble/tag/color.vue +36 -0
  254. package/src/components/editor-main/src/components/menus/bubble/tag/delete.vue +14 -0
  255. package/src/components/editor-main/src/components/menus/bubble/tag/input.vue +63 -0
  256. package/src/components/editor-main/src/components/menus/bubble/text-box/background.vue +37 -0
  257. package/src/components/editor-main/src/components/menus/bubble/text-box/border.vue +186 -0
  258. package/src/components/editor-main/src/components/menus/bubble/text-box/writing-mode.vue +42 -0
  259. package/src/components/editor-main/src/components/menus/bubble/webpage/clickable.vue +31 -0
  260. package/src/components/editor-main/src/components/menus/bubble/webpage/open.vue +29 -0
  261. package/src/components/editor-main/src/components/menus/button.vue +630 -0
  262. package/src/components/editor-main/src/components/menus/toolbar/base/align-center.vue +33 -0
  263. package/src/components/editor-main/src/components/menus/toolbar/base/align-distributed.vue +18 -0
  264. package/src/components/editor-main/src/components/menus/toolbar/base/align-dropdown.vue +56 -0
  265. package/src/components/editor-main/src/components/menus/toolbar/base/align-justify.vue +18 -0
  266. package/src/components/editor-main/src/components/menus/toolbar/base/align-left.vue +32 -0
  267. package/src/components/editor-main/src/components/menus/toolbar/base/align-right.vue +33 -0
  268. package/src/components/editor-main/src/components/menus/toolbar/base/background-color.vue +72 -0
  269. package/src/components/editor-main/src/components/menus/toolbar/base/bold.vue +18 -0
  270. package/src/components/editor-main/src/components/menus/toolbar/base/bullet-list.vue +110 -0
  271. package/src/components/editor-main/src/components/menus/toolbar/base/clear-format.vue +15 -0
  272. package/src/components/editor-main/src/components/menus/toolbar/base/code.vue +18 -0
  273. package/src/components/editor-main/src/components/menus/toolbar/base/color.vue +75 -0
  274. package/src/components/editor-main/src/components/menus/toolbar/base/font-family.vue +528 -0
  275. package/src/components/editor-main/src/components/menus/toolbar/base/font-size.vue +163 -0
  276. package/src/components/editor-main/src/components/menus/toolbar/base/format-painter.vue +27 -0
  277. package/src/components/editor-main/src/components/menus/toolbar/base/heading.vue +322 -0
  278. package/src/components/editor-main/src/components/menus/toolbar/base/highlight.vue +127 -0
  279. package/src/components/editor-main/src/components/menus/toolbar/base/indent.vue +17 -0
  280. package/src/components/editor-main/src/components/menus/toolbar/base/italic.vue +18 -0
  281. package/src/components/editor-main/src/components/menus/toolbar/base/letter-spacing.vue +113 -0
  282. package/src/components/editor-main/src/components/menus/toolbar/base/line-height.vue +40 -0
  283. package/src/components/editor-main/src/components/menus/toolbar/base/margin.vue +118 -0
  284. package/src/components/editor-main/src/components/menus/toolbar/base/markdown.vue +50 -0
  285. package/src/components/editor-main/src/components/menus/toolbar/base/ordered-list.vue +184 -0
  286. package/src/components/editor-main/src/components/menus/toolbar/base/outdent.vue +17 -0
  287. package/src/components/editor-main/src/components/menus/toolbar/base/print.vue +19 -0
  288. package/src/components/editor-main/src/components/menus/toolbar/base/quote.vue +18 -0
  289. package/src/components/editor-main/src/components/menus/toolbar/base/redo.vue +20 -0
  290. package/src/components/editor-main/src/components/menus/toolbar/base/search-replace.vue +16 -0
  291. package/src/components/editor-main/src/components/menus/toolbar/base/select-all.vue +16 -0
  292. package/src/components/editor-main/src/components/menus/toolbar/base/strike.vue +18 -0
  293. package/src/components/editor-main/src/components/menus/toolbar/base/subscript.vue +18 -0
  294. package/src/components/editor-main/src/components/menus/toolbar/base/superscript.vue +18 -0
  295. package/src/components/editor-main/src/components/menus/toolbar/base/task-list.vue +47 -0
  296. package/src/components/editor-main/src/components/menus/toolbar/base/underline.vue +18 -0
  297. package/src/components/editor-main/src/components/menus/toolbar/base/undo.vue +18 -0
  298. package/src/components/editor-main/src/components/menus/toolbar/base/word-wrap.vue +47 -0
  299. package/src/components/editor-main/src/components/menus/toolbar/export/embed.vue +67 -0
  300. package/src/components/editor-main/src/components/menus/toolbar/export/html.vue +27 -0
  301. package/src/components/editor-main/src/components/menus/toolbar/export/image.vue +66 -0
  302. package/src/components/editor-main/src/components/menus/toolbar/export/pdf.vue +8 -0
  303. package/src/components/editor-main/src/components/menus/toolbar/export/share.vue +63 -0
  304. package/src/components/editor-main/src/components/menus/toolbar/export/text.vue +32 -0
  305. package/src/components/editor-main/src/components/menus/toolbar/insert/audio.vue +23 -0
  306. package/src/components/editor-main/src/components/menus/toolbar/insert/bookmark.vue +206 -0
  307. package/src/components/editor-main/src/components/menus/toolbar/insert/callout.vue +15 -0
  308. package/src/components/editor-main/src/components/menus/toolbar/insert/chinese-date.vue +112 -0
  309. package/src/components/editor-main/src/components/menus/toolbar/insert/code-block.vue +16 -0
  310. package/src/components/editor-main/src/components/menus/toolbar/insert/columns.vue +97 -0
  311. package/src/components/editor-main/src/components/menus/toolbar/insert/details.vue +34 -0
  312. package/src/components/editor-main/src/components/menus/toolbar/insert/emoji.vue +103 -0
  313. package/src/components/editor-main/src/components/menus/toolbar/insert/file.vue +23 -0
  314. package/src/components/editor-main/src/components/menus/toolbar/insert/footnote.vue +15 -0
  315. package/src/components/editor-main/src/components/menus/toolbar/insert/hard-break.vue +16 -0
  316. package/src/components/editor-main/src/components/menus/toolbar/insert/hr.vue +141 -0
  317. package/src/components/editor-main/src/components/menus/toolbar/insert/image.vue +84 -0
  318. package/src/components/editor-main/src/components/menus/toolbar/insert/link.vue +121 -0
  319. package/src/components/editor-main/src/components/menus/toolbar/insert/mention.vue +15 -0
  320. package/src/components/editor-main/src/components/menus/toolbar/insert/option-box.vue +324 -0
  321. package/src/components/editor-main/src/components/menus/toolbar/insert/symbol.vue +88 -0
  322. package/src/components/editor-main/src/components/menus/toolbar/insert/tag.vue +15 -0
  323. package/src/components/editor-main/src/components/menus/toolbar/insert/template.vue +76 -0
  324. package/src/components/editor-main/src/components/menus/toolbar/insert/text-box.vue +15 -0
  325. package/src/components/editor-main/src/components/menus/toolbar/insert/toc.vue +15 -0
  326. package/src/components/editor-main/src/components/menus/toolbar/insert/video.vue +23 -0
  327. package/src/components/editor-main/src/components/menus/toolbar/insert/web-page.vue +173 -0
  328. package/src/components/editor-main/src/components/menus/toolbar/page/background.vue +138 -0
  329. package/src/components/editor-main/src/components/menus/toolbar/page/break-marks.vue +26 -0
  330. package/src/components/editor-main/src/components/menus/toolbar/page/break.vue +20 -0
  331. package/src/components/editor-main/src/components/menus/toolbar/page/footer.vue +15 -0
  332. package/src/components/editor-main/src/components/menus/toolbar/page/header.vue +15 -0
  333. package/src/components/editor-main/src/components/menus/toolbar/page/line-number.vue +16 -0
  334. package/src/components/editor-main/src/components/menus/toolbar/page/margin.vue +17 -0
  335. package/src/components/editor-main/src/components/menus/toolbar/page/orientation.vue +63 -0
  336. package/src/components/editor-main/src/components/menus/toolbar/page/size.vue +67 -0
  337. package/src/components/editor-main/src/components/menus/toolbar/page/watermark.vue +200 -0
  338. package/src/components/editor-main/src/components/menus/toolbar/table/add-column-after.vue +20 -0
  339. package/src/components/editor-main/src/components/menus/toolbar/table/add-column-before.vue +20 -0
  340. package/src/components/editor-main/src/components/menus/toolbar/table/add-row-after.vue +20 -0
  341. package/src/components/editor-main/src/components/menus/toolbar/table/add-row-before.vue +20 -0
  342. package/src/components/editor-main/src/components/menus/toolbar/table/border-color.vue +35 -0
  343. package/src/components/editor-main/src/components/menus/toolbar/table/cells-align.vue +41 -0
  344. package/src/components/editor-main/src/components/menus/toolbar/table/cells-background.vue +32 -0
  345. package/src/components/editor-main/src/components/menus/toolbar/table/delete-column.vue +44 -0
  346. package/src/components/editor-main/src/components/menus/toolbar/table/delete-row.vue +44 -0
  347. package/src/components/editor-main/src/components/menus/toolbar/table/delete.vue +40 -0
  348. package/src/components/editor-main/src/components/menus/toolbar/table/fix.vue +17 -0
  349. package/src/components/editor-main/src/components/menus/toolbar/table/insert.vue +137 -0
  350. package/src/components/editor-main/src/components/menus/toolbar/table/merge-cells.vue +20 -0
  351. package/src/components/editor-main/src/components/menus/toolbar/table/next-cell.vue +21 -0
  352. package/src/components/editor-main/src/components/menus/toolbar/table/previous-cell.vue +21 -0
  353. package/src/components/editor-main/src/components/menus/toolbar/table/split-cell.vue +20 -0
  354. package/src/components/editor-main/src/components/menus/toolbar/table/toggle-header-cell.vue +20 -0
  355. package/src/components/editor-main/src/components/menus/toolbar/table/toggle-header-column.vue +20 -0
  356. package/src/components/editor-main/src/components/menus/toolbar/table/toggle-header-row.vue +20 -0
  357. package/src/components/editor-main/src/components/menus/toolbar/tools/barcode.vue +441 -0
  358. package/src/components/editor-main/src/components/menus/toolbar/tools/chinese-case.vue +135 -0
  359. package/src/components/editor-main/src/components/menus/toolbar/tools/diagrams.vue +141 -0
  360. package/src/components/editor-main/src/components/menus/toolbar/tools/echarts.vue +718 -0
  361. package/src/components/editor-main/src/components/menus/toolbar/tools/math.vue +339 -0
  362. package/src/components/editor-main/src/components/menus/toolbar/tools/mermaid.vue +293 -0
  363. package/src/components/editor-main/src/components/menus/toolbar/tools/mind-map.vue +7 -0
  364. package/src/components/editor-main/src/components/menus/toolbar/tools/qrcode.vue +293 -0
  365. package/src/components/editor-main/src/components/menus/toolbar/tools/signature.vue +208 -0
  366. package/src/components/editor-main/src/components/menus/toolbar/view/fullscreen.vue +17 -0
  367. package/src/components/editor-main/src/components/menus/toolbar/view/locale.vue +40 -0
  368. package/src/components/editor-main/src/components/menus/toolbar/view/page.vue +16 -0
  369. package/src/components/editor-main/src/components/menus/toolbar/view/preview.vue +16 -0
  370. package/src/components/editor-main/src/components/menus/toolbar/view/skin.vue +43 -0
  371. package/src/components/editor-main/src/components/menus/toolbar/view/theme.vue +41 -0
  372. package/src/components/editor-main/src/components/menus/toolbar/view/toc.vue +15 -0
  373. package/src/components/editor-main/src/components/menus/toolbar/view/web.vue +16 -0
  374. package/src/components/editor-main/src/components/menus/toolbar/view/zoom-auto.vue +27 -0
  375. package/src/components/editor-main/src/components/menus/toolbar/view/zoom-original.vue +18 -0
  376. package/src/components/editor-main/src/components/menus/toolbar/view/zoom.vue +35 -0
  377. package/src/components/editor-main/src/components/modal.vue +22 -0
  378. package/src/components/editor-main/src/components/page-options.vue +392 -0
  379. package/src/components/editor-main/src/components/picker/color.vue +208 -0
  380. package/src/components/editor-main/src/components/statusbar/about.vue +37 -0
  381. package/src/components/editor-main/src/components/statusbar/countdown.vue +273 -0
  382. package/src/components/editor-main/src/components/statusbar/index.vue +753 -0
  383. package/src/components/editor-main/src/components/statusbar/shortcuts.vue +313 -0
  384. package/src/components/editor-main/src/components/toolbar/classic.vue +325 -0
  385. package/src/components/editor-main/src/components/toolbar/index.vue +369 -0
  386. package/src/components/editor-main/src/components/toolbar/ribbon.vue +398 -0
  387. package/src/components/editor-main/src/components/toolbar/scrollable.vue +205 -0
  388. package/src/components/editor-main/src/components/tooltip.vue +23 -0
  389. package/src/components/editor-main/src/composables/copy.js +24 -0
  390. package/src/components/editor-main/src/composables/dialog.js +25 -0
  391. package/src/components/editor-main/src/composables/hotkeys.js +14 -0
  392. package/src/components/editor-main/src/composables/i18n.js +19 -0
  393. package/src/components/editor-main/src/composables/popup.js +11 -0
  394. package/src/components/editor-main/src/composables/select.js +13 -0
  395. package/src/components/editor-main/src/composables/state.js +30 -0
  396. package/src/components/editor-main/src/composables/toolbarSelection.js +68 -0
  397. package/src/components/editor-main/src/extensions/audio/index.js +59 -0
  398. package/src/components/editor-main/src/extensions/audio/node-view.vue +141 -0
  399. package/src/components/editor-main/src/extensions/bookmark.js +110 -0
  400. package/src/components/editor-main/src/extensions/break-marks.js +19 -0
  401. package/src/components/editor-main/src/extensions/bullet-list.js +21 -0
  402. package/src/components/editor-main/src/extensions/callout/index.js +128 -0
  403. package/src/components/editor-main/src/extensions/callout/node-view.vue +130 -0
  404. package/src/components/editor-main/src/extensions/code-block/index.js +32 -0
  405. package/src/components/editor-main/src/extensions/code-block/node-view.vue +399 -0
  406. package/src/components/editor-main/src/extensions/columns/dom.js +142 -0
  407. package/src/components/editor-main/src/extensions/columns/index.js +77 -0
  408. package/src/components/editor-main/src/extensions/columns/keymap.js +62 -0
  409. package/src/components/editor-main/src/extensions/columns/resize.js +60 -0
  410. package/src/components/editor-main/src/extensions/columns/schema.js +47 -0
  411. package/src/components/editor-main/src/extensions/columns/state.js +26 -0
  412. package/src/components/editor-main/src/extensions/columns/utils.js +55 -0
  413. package/src/components/editor-main/src/extensions/datetime/index.js +55 -0
  414. package/src/components/editor-main/src/extensions/datetime/node-view.vue +116 -0
  415. package/src/components/editor-main/src/extensions/echarts/cal-service.js +142 -0
  416. package/src/components/editor-main/src/extensions/echarts/index.js +115 -0
  417. package/src/components/editor-main/src/extensions/echarts/node-view.vue +220 -0
  418. package/src/components/editor-main/src/extensions/file/index.js +254 -0
  419. package/src/components/editor-main/src/extensions/file/node-view.vue +333 -0
  420. package/src/components/editor-main/src/extensions/file-handler.js +93 -0
  421. package/src/components/editor-main/src/extensions/foonotes/footnote.js +152 -0
  422. package/src/components/editor-main/src/extensions/foonotes/footnotes.js +41 -0
  423. package/src/components/editor-main/src/extensions/foonotes/index.js +7 -0
  424. package/src/components/editor-main/src/extensions/foonotes/reference.js +211 -0
  425. package/src/components/editor-main/src/extensions/foonotes/rules.js +103 -0
  426. package/src/components/editor-main/src/extensions/foonotes/utils.js +171 -0
  427. package/src/components/editor-main/src/extensions/format-painter.js +104 -0
  428. package/src/components/editor-main/src/extensions/horizontal-rule.js +93 -0
  429. package/src/components/editor-main/src/extensions/iframe/index.js +54 -0
  430. package/src/components/editor-main/src/extensions/iframe/node-view.vue +106 -0
  431. package/src/components/editor-main/src/extensions/image/image-resizer.vue +349 -0
  432. package/src/components/editor-main/src/extensions/image/index.js +216 -0
  433. package/src/components/editor-main/src/extensions/image/node-view.vue +592 -0
  434. package/src/components/editor-main/src/extensions/indent.js +226 -0
  435. package/src/components/editor-main/src/extensions/index.js +341 -0
  436. package/src/components/editor-main/src/extensions/letter-spacing.js +66 -0
  437. package/src/components/editor-main/src/extensions/line-height.js +147 -0
  438. package/src/components/editor-main/src/extensions/margin.js +266 -0
  439. package/src/components/editor-main/src/extensions/mention/index.js +33 -0
  440. package/src/components/editor-main/src/extensions/mention/mentions.vue +180 -0
  441. package/src/components/editor-main/src/extensions/mention/suggestion.js +90 -0
  442. package/src/components/editor-main/src/extensions/node-align.js +164 -0
  443. package/src/components/editor-main/src/extensions/node-select.js +51 -0
  444. package/src/components/editor-main/src/extensions/office-paste/index.js +70 -0
  445. package/src/components/editor-main/src/extensions/office-paste/transform/bookmark.js +17 -0
  446. package/src/components/editor-main/src/extensions/office-paste/transform/excel.js +85 -0
  447. package/src/components/editor-main/src/extensions/office-paste/transform/html-classes.js +9 -0
  448. package/src/components/editor-main/src/extensions/office-paste/transform/line-number.js +10 -0
  449. package/src/components/editor-main/src/extensions/office-paste/transform/list.js +148 -0
  450. package/src/components/editor-main/src/extensions/office-paste/transform/style.js +24 -0
  451. package/src/components/editor-main/src/extensions/office-paste/utils.js +120 -0
  452. package/src/components/editor-main/src/extensions/option-box/index.js +77 -0
  453. package/src/components/editor-main/src/extensions/option-box/node-view.vue +194 -0
  454. package/src/components/editor-main/src/extensions/ordered-list.js +36 -0
  455. package/src/components/editor-main/src/extensions/page-break.js +42 -0
  456. package/src/components/editor-main/src/extensions/search-replace.js +304 -0
  457. package/src/components/editor-main/src/extensions/selection.js +38 -0
  458. package/src/components/editor-main/src/extensions/table.js +65 -0
  459. package/src/components/editor-main/src/extensions/tag/index.js +47 -0
  460. package/src/components/editor-main/src/extensions/tag/node-view.vue +51 -0
  461. package/src/components/editor-main/src/extensions/text-align.js +44 -0
  462. package/src/components/editor-main/src/extensions/text-box/index.js +78 -0
  463. package/src/components/editor-main/src/extensions/text-box/node-view.vue +141 -0
  464. package/src/components/editor-main/src/extensions/toc/index.js +48 -0
  465. package/src/components/editor-main/src/extensions/toc/node-view.vue +159 -0
  466. package/src/components/editor-main/src/extensions/type-writer.js +256 -0
  467. package/src/components/editor-main/src/extensions/video/index.js +65 -0
  468. package/src/components/editor-main/src/extensions/video/node-view.vue +211 -0
  469. package/src/components/editor-main/src/extensions/word-wrap.js +94 -0
  470. package/src/components/editor-main/src/i18n.js +15 -0
  471. package/src/components/editor-main/src/locales/bo.json +707 -0
  472. package/src/components/editor-main/src/locales/en-US.json +802 -0
  473. package/src/components/editor-main/src/locales/it-IT.json +721 -0
  474. package/src/components/editor-main/src/locales/ru-RU.json +779 -0
  475. package/src/components/editor-main/src/locales/zh-CN.json +804 -0
  476. package/src/components/editor-main/src/options/config/dicts.js +369 -0
  477. package/src/components/editor-main/src/options/config/index.js +203 -0
  478. package/src/components/editor-main/src/options/index.js +7 -0
  479. package/src/components/editor-main/src/options/schema.js +732 -0
  480. package/src/components/editor-main/src/utils/content-transform.js +12 -0
  481. package/src/components/editor-main/src/utils/copyright.js +4 -0
  482. package/src/components/editor-main/src/utils/diagram-editor.js +153 -0
  483. package/src/components/editor-main/src/utils/editor-scroll.js +75 -0
  484. package/src/components/editor-main/src/utils/file.js +177 -0
  485. package/src/components/editor-main/src/utils/history-record.js +135 -0
  486. package/src/components/editor-main/src/utils/load-resource.js +45 -0
  487. package/src/components/editor-main/src/utils/options.js +25 -0
  488. package/src/components/editor-main/src/utils/player.js +91 -0
  489. package/src/components/editor-main/src/utils/selection.js +39 -0
  490. package/src/components/editor-main/src/utils/short-id.js +4 -0
  491. package/src/components/editor-main/src/utils/shortcut.js +17 -0
  492. package/src/components/editor-main/src/utils/time-ago.js +8 -0
  493. package/src/components/editor-main/umo-build-entry.js +570 -0
  494. package/src/css/elementUI/col.scss +10 -2
  495. package/src/css/elementUI/mixins/_col.scss +10 -2
  496. package/vite/highlightJsLibVirtual.ts +98 -0
  497. package/vite/nodeModulesResolve.ts +175 -0
  498. package/vite/projectRoot.ts +17 -0
  499. package/vite/tiptapUmoResolve.ts +85 -0
  500. package/vite/tiptapVueRendererFix.ts +171 -0
  501. package/vite/umoCjsVirtual.ts +192 -0
  502. package/vite/umoIntegration.js +661 -0
  503. package/vite/umoIntegration.ts +56 -0
  504. package/vite/yjsPeerResolve.ts +46 -0
  505. package/vite.config.ts +8 -0
  506. package/vite.config.umo.ts +81 -0
  507. package/src/components/RichTextEditor/UmoRichTextEditor.vue +0 -257
  508. package/src/types/umoteam-editor.d.ts +0 -8
@@ -0,0 +1,1396 @@
1
+ <template>
2
+ <t-config-provider
3
+ :key="options.editorKey"
4
+ :global-config="{
5
+ ...localeConfig[locale],
6
+ classPrefix: 'umo',
7
+ }"
8
+ >
9
+ <Teleport to="body" :disabled="!fullscreen">
10
+ <div
11
+ :id="container.substr(1)"
12
+ class="umo-editor-container"
13
+ :class="{
14
+ 'toolbar-classic': isRecord($toolbar) && $toolbar.mode === 'classic',
15
+ 'toolbar-ribbon': isRecord($toolbar) && $toolbar.mode === 'ribbon',
16
+ 'preview-mode': page.preview?.enabled,
17
+ 'laser-pointer': page.preview?.enabled && page.preview?.laserPointer,
18
+ 'umo-editor-is-fullscreen': fullscreen,
19
+ 'umo-editor-is-typerwriter-runing': typeWriterIsRunning,
20
+ 'umo-skin-default': options.skin === 'default',
21
+ 'umo-skin-modern': options.skin === 'modern',
22
+ }"
23
+ :style="{
24
+ height: options.height,
25
+ zIndex: fullscreen ? options.fullscreenZIndex : 'unset',
26
+ }"
27
+ >
28
+ <header v-if="!options.document?.readOnly" class="umo-toolbar">
29
+ <toolbar
30
+ :key="toolbarKey"
31
+ @menu-change="(event) => emits('changed:menu', event)"
32
+ >
33
+ <template
34
+ v-for="item in options.toolbar?.menus"
35
+ :key="item"
36
+ #[`toolbar_${item}`]="slotProps"
37
+ >
38
+ <slot :name="`toolbar_${item}`" v-bind="slotProps" />
39
+ </template>
40
+ </toolbar>
41
+ </header>
42
+ <main class="umo-main">
43
+ <container-page>
44
+ <template #bubble_menu="slotProps">
45
+ <slot name="bubble_menu" v-bind="slotProps" />
46
+ </template>
47
+ </container-page>
48
+ </main>
49
+ <footer class="umo-footer">
50
+ <statusbar />
51
+ </footer>
52
+ </div>
53
+ </Teleport>
54
+ </t-config-provider>
55
+ </template>
56
+
57
+ <script setup>
58
+ import { useConfirm } from '../composables/dialog.js';
59
+
60
+ import { useAlert } from '../composables/dialog.js';
61
+ import { ref as _ref } from 'vue';
62
+
63
+ import {
64
+ isBoolean,
65
+ isNumber,
66
+ isRecord,
67
+ isString,
68
+ } from '@tool-belt/type-predicates'
69
+ import domToImage from 'dom-to-image-more'
70
+ import enConfig from 'tdesign-vue-next/esm/locale/en_US'
71
+ import cnConfig from 'tdesign-vue-next/esm/locale/zh_CN'
72
+
73
+ import { getTypewriterRunState } from '../extensions/type-writer'
74
+ import { i18n } from '../i18n'
75
+ import { propsOptions } from '../options'
76
+ import { contentTransform } from '../utils/content-transform'
77
+ import {
78
+ addHistory,
79
+ redoHistoryRecord,
80
+ undoHistoryRecord,
81
+ } from '../utils/history-record'
82
+ import { getOpitons } from '../utils/options'
83
+ import { getSelectionNode, getSelectionText } from '../utils/selection'
84
+ import { syncCacheOnEditorSelectionUpdate } from '../composables/toolbarSelection.js'
85
+ import { shortId } from '../utils/short-id'
86
+ import { getCurrentInstance } from 'vue'
87
+
88
+ import { ref, inject, provide, watch, nextTick, onMounted, onBeforeUnmount } from 'vue';
89
+ import { useStorage, isDefined, useTimestamp } from '@vueuse/core';
90
+ import { useState } from '../composables/state.js';
91
+ const { toBlob, toJpeg, toPng } = domToImage
92
+
93
+ defineOptions({ name: 'UmoEditor' })
94
+
95
+ // Props and Emits
96
+ const props = defineProps(propsOptions)
97
+ const emits = defineEmits([
98
+ 'beforeCreate',
99
+ 'created',
100
+ 'changed',
101
+ 'changed:selection',
102
+ 'changed:transaction',
103
+ 'changed:menu',
104
+ 'changed:toolbar',
105
+ 'changed:pageLayout',
106
+ 'changed:pageSize',
107
+ 'changed:pageOrientation',
108
+ 'changed:pageMargin',
109
+ 'changed:pageBackground',
110
+ 'changed:pageShowToc',
111
+ 'changed:pagePreview',
112
+ 'changed:pageZoom',
113
+ 'changed:pageWatermark',
114
+ 'changed:locale',
115
+ 'changed:theme',
116
+ 'changed:skin',
117
+ 'print',
118
+ 'focus',
119
+ 'blur',
120
+ 'paste',
121
+ 'drop',
122
+ 'delete',
123
+ 'saved',
124
+ 'destroy',
125
+ ])
126
+ // 撤销重做的记录步骤
127
+ const historyRecords = ref({
128
+ done: [], // 能撤销的记录数组
129
+ undone: [], // 能重做的记录数组
130
+ isUndoRedo: false, // 标记是否正在执行撤销/重做操作
131
+ editorCount: 0,
132
+ })
133
+
134
+ const container = _ref(`#umo-editor-${shortId(4)}`)
135
+ const defaultOptions = inject('defaultOptions', {})
136
+ const options = ref(getOpitons(props, defaultOptions))
137
+ const editor = ref(null)
138
+ const savedAt = ref(null)
139
+ const page = ref({})
140
+ const blockMenu = ref(false)
141
+ const imageViewer = ref({ visible: false, current: null })
142
+ const searchReplace = ref(false)
143
+ const printing = ref(false)
144
+ const fullscreen = ref(false)
145
+ const exportFile = ref({ pdf: false, image: false })
146
+ const uploadFileMap = ref(new Map())
147
+ // const bookmark = ref(false)
148
+ const destroyed = ref(false)
149
+ const typeWriterIsRunning = ref(false)
150
+
151
+ const $toolbar = useState('toolbar', options)
152
+ const $document = useState('document', options)
153
+ const $layout = useState('layout', options)
154
+
155
+ provide('container', container.value)
156
+ provide('options', options)
157
+ provide('editor', editor)
158
+ provide('savedAt', savedAt)
159
+ provide('page', page)
160
+ provide('blockMenu', blockMenu)
161
+ provide('imageViewer', imageViewer)
162
+ provide('searchReplace', searchReplace)
163
+ provide('printing', printing)
164
+ provide('fullscreen', fullscreen)
165
+ provide('exportFile', exportFile)
166
+ provide('uploadFileMap', uploadFileMap)
167
+ // provide('bookmark', bookmark)
168
+ provide('destroyed', destroyed)
169
+ provide('historyRecords', historyRecords)
170
+ provide('typeWriterIsRunning', typeWriterIsRunning)
171
+
172
+ watch(fullscreen, (isFullscreen) => {
173
+ if (typeof document === 'undefined') return
174
+ document.body.style.overflow = isFullscreen ? 'hidden' : ''
175
+ })
176
+
177
+ watch(
178
+ () => options.value.page,
179
+ ({
180
+ layouts,
181
+ defaultBackground,
182
+ defaultMargin,
183
+ defaultOrientation,
184
+ watermark,
185
+ showBreakMarks,
186
+ showBookmark,
187
+ showLineNumber,
188
+ showToc,
189
+ }) => {
190
+ page.value = {
191
+ layout: $layout.value || layouts[0],
192
+ size: options.value.dicts?.pageSizes.find((item) => item.default),
193
+ margin: defaultMargin,
194
+ background: defaultBackground,
195
+ orientation: defaultOrientation,
196
+ watermark,
197
+ showBreakMarks,
198
+ showBookmark,
199
+ showLineNumber,
200
+ showToc,
201
+ zoomLevel: 100,
202
+ autoWidth: false,
203
+ preview: {
204
+ enabled: false,
205
+ scale: 1,
206
+ zoom: 100,
207
+ },
208
+ }
209
+ editor.value?.commands.showInvisibleCharacters(showBreakMarks)
210
+ },
211
+ { immediate: true, deep: true },
212
+ )
213
+ watch(
214
+ () => options.value.document?.readOnly,
215
+ (val) => {
216
+ editor.value?.setEditable(!val)
217
+ },
218
+ )
219
+
220
+ let toolbarKey = _ref(shortId())
221
+ let toolbarActive = ref(null)
222
+ provide('toolbarActive', toolbarActive)
223
+ watch(
224
+ () => [options.value.document?.readOnly, editor.value?.isEditable],
225
+ async () => {
226
+ await nextTick()
227
+ toolbarKey.value = shortId()
228
+ },
229
+ )
230
+
231
+ // Lifecycle Hooks
232
+ onMounted(() => {
233
+ const theme = useStorage('umo-editor:theme', options.value.theme)
234
+ const skin = useStorage('umo-editor:skin', options.value.skin)
235
+ setTheme(theme.value)
236
+ setSkin(skin.value)
237
+ window.addEventListener('beforeunload', handleBeforeUnload)
238
+ })
239
+ onBeforeUnmount(() => {
240
+ window.removeEventListener('beforeunload', handleBeforeUnload)
241
+ if (typeof document !== 'undefined') {
242
+ document.body.style.overflow = ''
243
+ }
244
+ clearAutoSaveInterval()
245
+ destroy()
246
+ })
247
+
248
+ // Watchers
249
+ watch(
250
+ () => props,
251
+ () => setOptions(props),
252
+ { deep: true },
253
+ )
254
+
255
+ watch(
256
+ () => options.value.theme,
257
+ (theme) => {
258
+ setTheme(theme)
259
+ },
260
+ )
261
+
262
+ watch(
263
+ () => options.value.document,
264
+ (val) => {
265
+ $document.value = val
266
+ },
267
+ )
268
+
269
+ watch(
270
+ () => getTypewriterRunState(),
271
+ (newValue) => {
272
+ typeWriterIsRunning.value = newValue
273
+ console.log('typeWriterIsRunning', typeWriterIsRunning)
274
+ },
275
+ )
276
+
277
+ // 定时保存
278
+ let contentUpdated = _ref(false)
279
+ let isFirstUpdate = _ref(true)
280
+ let autoSaveInterval = _ref(null)
281
+ let isSaving = _ref(false)
282
+ const shouldBlockUnload = () => isSaving.value || contentUpdated.value
283
+ const handleBeforeUnload = (event) => {
284
+ if (!shouldBlockUnload()) {
285
+ return
286
+ }
287
+ event.preventDefault()
288
+ event.returnValue = ''
289
+ }
290
+ const clearAutoSaveInterval = () => {
291
+ if (autoSaveInterval.value !== null) {
292
+ clearInterval(autoSaveInterval.value)
293
+ autoSaveInterval.value = null
294
+ }
295
+ }
296
+ watch(
297
+ () => contentUpdated.value,
298
+ (val) => {
299
+ const { autoSave } = options.value.document
300
+ if (!autoSave?.enabled) {
301
+ return
302
+ }
303
+ if (isFirstUpdate.value) {
304
+ isFirstUpdate.value = false
305
+ setTimeout(() => {
306
+ contentUpdated.value = false
307
+ })
308
+ return
309
+ }
310
+ if (!val) {
311
+ clearAutoSaveInterval()
312
+ return
313
+ }
314
+ autoSaveInterval.value = setInterval(() => {
315
+ saveContent()
316
+ contentUpdated.value = false
317
+ clearAutoSaveInterval()
318
+ }, autoSave.interval)
319
+ },
320
+ )
321
+
322
+ watch(
323
+ () => editor.value,
324
+ () => {
325
+ if (!editor.value) {
326
+ return
327
+ }
328
+ editor.value.on('create', ({ editor }) => {
329
+ destroyed.value = false
330
+ emits('created', { editor })
331
+ })
332
+ editor.value.on('update', ({ editor }) => {
333
+ emits('changed', { editor })
334
+ contentUpdated.value = true
335
+ })
336
+ editor.value.on('selectionUpdate', ({ editor }) => {
337
+ syncCacheOnEditorSelectionUpdate(editor)
338
+ emits('changed:selection', { editor })
339
+ })
340
+ editor.value.on('transaction', ({ editor, transaction }) => {
341
+ emits('changed:transaction', { editor, transaction })
342
+ })
343
+ editor.value.on('focus', ({ editor, event }) => {
344
+ emits('focus', { editor, event })
345
+ })
346
+ editor.value.on('blur', ({ editor, event }) => {
347
+ emits('blur', { editor, event })
348
+ })
349
+ editor.value.on('paste', ({ event, slice }) => {
350
+ emits('paste', { event, slice })
351
+ })
352
+ editor.value.on('drop', ({ event, slice, moved }) => {
353
+ emits('drop', { event, slice, moved })
354
+ })
355
+ editor.value.on(
356
+ 'delete',
357
+ ({
358
+ type,
359
+ deletedRange,
360
+ newRange,
361
+ partial,
362
+ node,
363
+ mark,
364
+ from,
365
+ to,
366
+ newFrom,
367
+ newTo,
368
+ }) => {
369
+ emits('delete', {
370
+ type,
371
+ deletedRange,
372
+ newRange,
373
+ partial,
374
+ node,
375
+ mark,
376
+ from,
377
+ to,
378
+ newFrom,
379
+ newTo,
380
+ })
381
+ },
382
+ )
383
+ editor.value.on('destroy', () => {
384
+ emits('destroy')
385
+ })
386
+ },
387
+ )
388
+
389
+ watch(
390
+ () => $toolbar.value,
391
+ (toolbar, oldToolbar) => {
392
+ emits('changed:toolbar', { toolbar, oldToolbar })
393
+ },
394
+ { deep: true },
395
+ )
396
+
397
+ watch(
398
+ () => page.value.layout,
399
+ (pageLayout, oldPageLayout) => {
400
+ if (pageLayout === oldPageLayout) {
401
+ return
402
+ }
403
+ emits('changed:pageLayout', { pageLayout, oldPageLayout })
404
+ addHistory(historyRecords, 'page', {
405
+ proType: 'layout',
406
+ newData: pageLayout,
407
+ oldData: oldPageLayout,
408
+ })
409
+ if (pageLayout === 'web') {
410
+ setSkin('default')
411
+ }
412
+ $layout.value = pageLayout
413
+ },
414
+ )
415
+
416
+ watch(
417
+ () => page.value.size,
418
+ (pageSize, oldPageSize) => {
419
+ emits('changed:pageSize', { pageSize, oldPageSize })
420
+ addHistory(historyRecords, 'page', {
421
+ proType: 'size',
422
+ newData: pageSize,
423
+ oldData: oldPageSize,
424
+ })
425
+ },
426
+ { deep: true },
427
+ )
428
+
429
+ watch(
430
+ () => page.value.margin,
431
+ (pageMargin, oldPageMargin) => {
432
+ emits('changed:pageMargin', { pageMargin, oldPageMargin })
433
+ addHistory(historyRecords, 'page', {
434
+ proType: 'margin',
435
+ newData: pageMargin,
436
+ oldData: oldPageMargin,
437
+ })
438
+ },
439
+ { deep: true },
440
+ )
441
+
442
+ watch(
443
+ () => page.value.background,
444
+ (pageBackground, oldPageBackground) => {
445
+ emits('changed:pageBackground', { pageBackground, oldPageBackground })
446
+ addHistory(historyRecords, 'page', {
447
+ proType: 'background',
448
+ newData: pageBackground,
449
+ oldData: oldPageBackground,
450
+ })
451
+ },
452
+ )
453
+
454
+ watch(
455
+ () => page.value.orientation,
456
+ (pageOrientation, oldPageOrientation) => {
457
+ emits('changed:pageOrientation', { pageOrientation, oldPageOrientation })
458
+ addHistory(historyRecords, 'page', {
459
+ proType: 'orientation',
460
+ newData: pageOrientation,
461
+ oldData: oldPageOrientation,
462
+ })
463
+ },
464
+ )
465
+
466
+ watch(
467
+ () => page.value.showToc,
468
+ (showToc) => {
469
+ emits('changed:pageShowToc', showToc)
470
+ },
471
+ )
472
+
473
+ watch(
474
+ () => page.value.zoomLevel,
475
+ (zoomLevel, oldZoomLevel) => {
476
+ emits('changed:pageZoom', { zoomLevel, oldZoomLevel })
477
+ addHistory(historyRecords, 'page', {
478
+ proType: 'zoomLevel',
479
+ newData: zoomLevel,
480
+ oldData: oldZoomLevel,
481
+ })
482
+ },
483
+ )
484
+
485
+ watch(
486
+ () => page.value.preview?.enabled,
487
+ (previewEnabled) => {
488
+ emits('changed:pagePreview', previewEnabled)
489
+ try {
490
+ setTimeout(() => {
491
+ const containerEl = document.querySelector(
492
+ `${container.value} .umo-zoomable-container`,
493
+ )
494
+ if (containerEl) containerEl.scrollTop = 0
495
+ }, 200)
496
+ } catch {}
497
+ },
498
+ )
499
+
500
+ watch(
501
+ () => page.value.watermark,
502
+ (pageWatermark, oldPageWatermark) => {
503
+ emits('changed:pageWatermark', { pageWatermark, oldPageWatermark })
504
+ // 增加水印撤回
505
+ addHistory(historyRecords, 'page', {
506
+ proType: 'watermark',
507
+ newData: pageWatermark,
508
+ oldData: oldPageWatermark,
509
+ })
510
+ },
511
+ { deep: true },
512
+ )
513
+
514
+ watch(
515
+ () => printing.value,
516
+ () => {
517
+ emits('print')
518
+ },
519
+ { deep: true },
520
+ )
521
+
522
+ // i18n Setup
523
+ import { l } from '../composables/i18n.js'
524
+ const { t, locale, mergeLocaleMessage } = useI18n()
525
+ const $locale = useStorage('umo-editor:locale', options.value.locale)
526
+ locale.value = $locale.value
527
+ const getLocaleMessage = (lang) => {
528
+ const translations = options.value.translations?.[lang.replaceAll('-', '_')]
529
+ if (isRecord(translations)) {
530
+ return translations
531
+ }
532
+ return {}
533
+ }
534
+ mergeLocaleMessage(locale.value, getLocaleMessage(locale.value))
535
+ const { appContext } = getCurrentInstance()
536
+ if (appContext) {
537
+ appContext.config.globalProperties.t = t
538
+ appContext.config.globalProperties.l = l
539
+ }
540
+ watch(
541
+ () => locale.value,
542
+ (locale, oldLocale) => {
543
+ emits('changed:locale', { locale, oldLocale })
544
+ },
545
+ )
546
+
547
+ // Global Locale Config
548
+ const localeConfig = _ref({
549
+ 'zh-CN': cnConfig,
550
+ 'en-US': enConfig,
551
+ })
552
+
553
+ // Options Setup
554
+ const setOptions = (value) => {
555
+ try {
556
+ options.value = getOpitons(value)
557
+ const $locale = useStorage('umo-editor:locale', options.value.locale)
558
+ if (!$locale.value) {
559
+ $locale.value = options.value.locale
560
+ }
561
+ } catch {}
562
+ return options.value
563
+ }
564
+
565
+ // Theme Setup
566
+ const setTheme = (theme) => {
567
+ if (!isString(theme) || !['light', 'dark', 'auto'].includes(theme)) {
568
+ throw new Error('"theme" must be one of "light", "dark" or "auto".')
569
+ }
570
+ if (theme !== 'auto') {
571
+ document.querySelector('html')?.setAttribute('theme-mode', theme)
572
+
573
+ const $theme = useStorage('umo-editor:theme', options.value.theme)
574
+ $theme.value = theme
575
+ emits('changed:theme', theme)
576
+ return
577
+ }
578
+ const darkScheme = '(prefers-color-scheme: dark)'
579
+ const prefersDarkScheme = window.matchMedia(darkScheme).matches
580
+ setTheme(prefersDarkScheme ? 'dark' : 'light')
581
+ window.matchMedia(darkScheme).addEventListener('change', (e) => {
582
+ setTheme(e.matches ? 'dark' : 'light')
583
+ })
584
+ }
585
+
586
+ // Skin Setup
587
+ const setSkin = (skin) => {
588
+ if (!isString(skin) || !['modern', 'default'].includes(skin)) {
589
+ throw new Error('"skin" must be one of "modern" or "default".')
590
+ }
591
+ const $skin = useStorage('umo-editor:skin', options.value.skin)
592
+ $skin.value = skin
593
+ options.value.skin = skin
594
+ emits('changed:skin', skin)
595
+ }
596
+
597
+ // Toolbar and Page Setup Methods
598
+ const setToolbar = (params) => {
599
+ if (!isRecord(params)) {
600
+ throw new Error('params must be an object.')
601
+ }
602
+ if (params.mode) {
603
+ if (!isString(params.mode)) {
604
+ throw new Error('"params.mode" must be a string.')
605
+ }
606
+ if (!['classic', 'ribbon'].includes(params.mode)) {
607
+ throw new Error('"params.mode" must be one of "classic" or "ribbon".')
608
+ }
609
+ $toolbar.value.mode = params.mode
610
+ }
611
+ if (isDefined(params.show)) {
612
+ if (!isBoolean(params.show)) {
613
+ throw new Error('"params.show" must be a boolean.')
614
+ }
615
+ $toolbar.value.show = params.show
616
+ }
617
+ }
618
+
619
+ const setLayout = (layout) => {
620
+ if (!options.value.page.layouts.includes(layout)) {
621
+ throw new Error(
622
+ `"params.layout" must be one of ${JSON.stringify(options.value.page.layouts)}.`,
623
+ )
624
+ }
625
+ page.value.layout = layout
626
+ }
627
+
628
+ const setPage = (params) => {
629
+ if (!isRecord(params)) {
630
+ throw new Error('params must be an object.')
631
+ }
632
+ if (params.size) {
633
+ if (!isString(params.size)) {
634
+ throw new Error('"params.size" must be a string.')
635
+ }
636
+ const size = options.value.dicts?.pageSizes.find(
637
+ (item) => item.label === params.size || l(item.label) === params.size,
638
+ )
639
+ if (!size) {
640
+ throw new Error(
641
+ `"params.size" must be one of ${options.value.dicts?.pageSizes.map((item) => l(item.label))}.`,
642
+ )
643
+ }
644
+ page.value.size = size
645
+ }
646
+ if (params.orientation) {
647
+ if (!isString(params.orientation)) {
648
+ throw new Error('"params.orientation" must be a string.')
649
+ }
650
+ if (!['portrait', 'landscape'].includes(params.orientation)) {
651
+ throw new Error(
652
+ '"params.orientation" must be one of "portrait" or "landscape".',
653
+ )
654
+ }
655
+ page.value.orientation = params.orientation
656
+ }
657
+
658
+ if (params.background) {
659
+ if (!isString(params.background)) {
660
+ throw new Error('"params.background" must be a string.')
661
+ }
662
+ page.value.background = params.background
663
+ }
664
+
665
+ if (params.layout) {
666
+ if (!options.value.page.layouts.includes(params.layout)) {
667
+ throw new Error(
668
+ `"params.layout" must be one of ${JSON.stringify(options.value.page.layouts)}.`,
669
+ )
670
+ }
671
+ page.value.layout = params.layout
672
+ }
673
+
674
+ if (params.margin) {
675
+ const marginKeys = ['left', 'right', 'top', 'bottom']
676
+ const copyMargin = { ...page.value.margin }
677
+ for (const key of marginKeys) {
678
+ if (params.margin[key] !== undefined) {
679
+ if (!isNumber(params.margin[key])) {
680
+ throw new Error(`"params.margin.${key}" must be a number.`)
681
+ }
682
+ copyMargin[key] = params.margin[key]
683
+ }
684
+ }
685
+ page.value.margin = copyMargin
686
+ }
687
+ }
688
+
689
+ const setWatermark = (params) => {
690
+ if (!isRecord(params)) {
691
+ throw new Error('params must be an object.')
692
+ }
693
+ page.value.watermark = {}
694
+
695
+ if (isDefined(params.alpha)) {
696
+ if (!isNumber(params.alpha)) {
697
+ throw new Error('"params.alpha" must be a number.')
698
+ }
699
+ page.value.watermark.alpha = params.alpha
700
+ }
701
+ if (params.text) {
702
+ if (!isString(params.text)) {
703
+ throw new Error('"params.text" must be a string.')
704
+ }
705
+ if (params.text.length > 30) {
706
+ throw new Error('"params.text" must be less than 30 characters.')
707
+ }
708
+ page.value.watermark.text = params.text
709
+ }
710
+
711
+ if (params.type) {
712
+ if (!isString(params.type)) {
713
+ throw new Error('"params.type" must be a string.')
714
+ }
715
+ if (!['compact', 'spacious'].includes(params.type)) {
716
+ throw new Error('"params.type" must be one of "compact" or "spacious".')
717
+ }
718
+ page.value.watermark.type = params.type
719
+ }
720
+ if (params.fontColor) {
721
+ if (!isString(params.fontColor)) {
722
+ throw new Error('"params.fontColor" must be a string.')
723
+ }
724
+ page.value.watermark.fontColor = params.fontColor
725
+ }
726
+ if (params.fontSize) {
727
+ if (!isNumber(params.fontSize)) {
728
+ throw new Error('"params.fontSize" must be a number.')
729
+ }
730
+ page.value.watermark.fontSize = params.fontSize
731
+ }
732
+ if (params.fontFamily || params.fontFamily === null) {
733
+ if (params.fontFamily !== null && !isString(params.fontFamily)) {
734
+ throw new Error('"params.fontFamily" must be a string.')
735
+ }
736
+ page.value.watermark.fontFamily = params.fontFamily
737
+ }
738
+ if (params.fontWeight) {
739
+ if (!isString(params.fontWeight)) {
740
+ throw new Error('"params.fontWeight" must be a string.')
741
+ }
742
+ if (!['normal', 'bold', 'bolder'].includes(params.fontWeight)) {
743
+ throw new Error(
744
+ '"params.fontWeight" must be one of "normal", "bold" or "bolder".',
745
+ )
746
+ }
747
+ page.value.watermark.fontWeight = params.fontWeight
748
+ }
749
+ }
750
+
751
+ const setDocument = (params) => {
752
+ if (!isRecord(params)) {
753
+ throw new Error('params must be an object.')
754
+ }
755
+ Object.keys(params).forEach((key) => {
756
+ options.value.document[key] = params[key]
757
+ $document.value[key] = params[key]
758
+ })
759
+ }
760
+
761
+ // Content Methods
762
+ const setContent = (
763
+ content,
764
+ options = {
765
+ emitUpdate: true,
766
+ focusPosition: 'start',
767
+ focusOptions: { scrollIntoView: true },
768
+ },
769
+ ) => {
770
+ if (!editor.value) {
771
+ throw new Error('editor is not ready!')
772
+ }
773
+ const doc = contentTransform(content)
774
+ editor.value
775
+ .chain()
776
+ .setContent(doc, { emitUpdate: options.emitUpdate })
777
+ .focus(options.focusPosition, options.focusOptions)
778
+ .run()
779
+ }
780
+
781
+ // Content Methods
782
+ const insertContent = (
783
+ content,
784
+ options = {
785
+ updateSelection: true,
786
+ focusPosition: 'start',
787
+ focusOptions: { scrollIntoView: true },
788
+ },
789
+ ) => {
790
+ if (!editor.value) {
791
+ throw new Error('editor is not ready!')
792
+ }
793
+ const doc = contentTransform(content)
794
+ editor.value
795
+ .chain()
796
+ .insertContent(doc, { updateSelection: options.updateSelection })
797
+ .focus(options.focusPosition, options.focusOptions)
798
+ .run()
799
+ }
800
+
801
+ const startTypewriter = (content, options) => {
802
+ if (!editor.value) {
803
+ throw new Error('editor is not ready!')
804
+ }
805
+ if (typeof content !== 'object') {
806
+ throw new Error('content is not object!')
807
+ }
808
+ setTimeout(() => {
809
+ editor?.value?.commands.focus('end')
810
+ editor?.value?.commands.startTypewriter(content, options)
811
+ }, 100)
812
+ }
813
+
814
+ const stopTypewriter = () => {
815
+ editor?.value?.commands.stopTypewriter()
816
+ }
817
+
818
+ const getTypewriterState = () => {
819
+ return editor?.value?.commands.getTypewriterState()
820
+ }
821
+
822
+ const getContent = (format = 'html') => {
823
+ if (!editor.value) {
824
+ throw new Error('editor is not ready!')
825
+ }
826
+ if (format === 'html') {
827
+ return editor.value.getHTML()
828
+ }
829
+ if (format === 'text') {
830
+ return editor.value.getText()
831
+ }
832
+ if (format === 'json') {
833
+ return editor.value.getJSON()
834
+ }
835
+ throw new Error('format must be html, text or json')
836
+ }
837
+
838
+ // Locale Methods
839
+ const setLocale = (lang, silent = true) => {
840
+ if (!['zh-CN', 'en-US'].includes(lang)) {
841
+ throw new Error('"params" must be one of "zh-CN" or "en-US".')
842
+ }
843
+ if (locale.value === lang) {
844
+ return
845
+ }
846
+ if (silent) {
847
+ $locale.value = lang
848
+ location.reload()
849
+ return
850
+ }
851
+ const dialog = useConfirm({
852
+ attach: container.value,
853
+ theme: 'warning',
854
+ header: t('changeLocale.title'),
855
+ body: t('changeLocale.message'),
856
+ confirmBtn: {
857
+ theme: 'warning',
858
+ content: t('changeLocale.confirm'),
859
+ },
860
+ onConfirm() {
861
+ dialog.destroy()
862
+ setTimeout(() => setLocale(lang), 300)
863
+ },
864
+ })
865
+ }
866
+
867
+ const getLocale = () => locale.value
868
+ const getI18n = () => i18n
869
+
870
+ // Export Methods
871
+ const getImage = async (format = 'blob') => {
872
+ const { zoomLevel } = page.value
873
+ try {
874
+ page.value.zoomLevel = 100
875
+ const node = document.querySelector(`${container.value} .umo-page-content`)
876
+ if (format === 'blob') {
877
+ return await toBlob(node)
878
+ }
879
+ if (format === 'jpeg') {
880
+ return await toJpeg(node)
881
+ }
882
+ if (format === 'png') {
883
+ return await toPng(node)
884
+ }
885
+ } catch {
886
+ throw new Error(t('export.image.error.message'))
887
+ } finally {
888
+ page.value.zoomLevel = zoomLevel
889
+ }
890
+ }
891
+
892
+ // Editor Interaction Methods
893
+ const getText = () => getContent('text')
894
+ const getHTML = () => getContent('html')
895
+ const getJSON = () => getContent('json')
896
+ const getVanillaHTML = async () => {
897
+ if (!editor.value) {
898
+ throw new Error('editor is not ready!')
899
+ }
900
+
901
+ // 克隆页面内容
902
+ const { readOnly } = options.value.document
903
+ const { isEditable } = editor.value
904
+ if (!readOnly) {
905
+ options.value.document.readOnly = true
906
+ }
907
+ await nextTick()
908
+ const pageNode = document
909
+ .querySelector(`${container.value} .umo-page-content`)
910
+ ?.cloneNode(true)
911
+ if (!readOnly) {
912
+ options.value.document.readOnly = false
913
+ }
914
+
915
+ const replaceIcons = (nodes, size = '1em') => {
916
+ const iconsNode = document.querySelector('#umo-icons')
917
+ nodes.forEach((el) => {
918
+ const icons = el.querySelectorAll('.umo-icon')
919
+ icons.forEach((svg) => {
920
+ const iconId = svg.childNodes[0].getAttribute('xlink:href')
921
+ svg.setAttribute('viewBox', '0 0 48 48')
922
+ svg.setAttribute('fill', 'none')
923
+ svg.setAttribute('width', size)
924
+ svg.setAttribute('height', size)
925
+ svg.innerHTML = iconsNode?.querySelector(iconId)?.innerHTML || ''
926
+ })
927
+ })
928
+ }
929
+
930
+ // 移除所有换行和回车标记
931
+ const breakNodes = pageNode.querySelectorAll(
932
+ '.tiptap-invisible-character, .ProseMirror-separator',
933
+ )
934
+ breakNodes.forEach((el) => el.remove())
935
+
936
+ // 如果存在视频或音频节点,则替换视频标签
937
+ const mediaNodes = pageNode.querySelectorAll(
938
+ '.umo-node-video, .umo-node-audio',
939
+ )
940
+ mediaNodes.forEach((el) => {
941
+ const mediaNode = el.querySelector('video, audio')
942
+ if (mediaNode) el.querySelector('.plyr')?.replaceWith(mediaNode)
943
+ })
944
+
945
+ // 如果存在文件节点,替换文件节点图标
946
+ const fileNodes = pageNode.querySelectorAll('.umo-node-file')
947
+ replaceIcons(fileNodes)
948
+
949
+ // 代码块处理
950
+ const codeBlockNodes = pageNode.querySelectorAll('.umo-code-block')
951
+ codeBlockNodes.forEach((el) => {
952
+ const wordWrapButton = el.querySelector('.umo-word-wrap-button')
953
+ if (wordWrapButton) {
954
+ wordWrapButton.remove()
955
+ }
956
+ const buttonNodes = el.querySelectorAll('.umo-button-text')
957
+ buttonNodes.forEach((item) => item.remove())
958
+ })
959
+ replaceIcons(codeBlockNodes, '16px')
960
+
961
+ // 图表处理
962
+ const chartNodes = pageNode.querySelectorAll('.umo-node-echarts')
963
+ chartNodes.forEach((el) => {
964
+ const chartNode = el.querySelector('.umo-node-echarts-body')
965
+ if (chartNode) {
966
+ chartNode.removeAttribute('_echarts_instance_')
967
+ chartNode.innerHTML = ''
968
+ }
969
+ })
970
+
971
+ // 公式样式
972
+ const mathNodes = pageNode.querySelectorAll('.tiptap-mathematics-render')
973
+ mathNodes.forEach((el) => {
974
+ const katexEl = el.querySelector('.katex')
975
+ if (katexEl) {
976
+ katexEl.innerHTML = katexEl.querySelector('.katex-html')?.innerHTML || ''
977
+ }
978
+ })
979
+
980
+ // 如果水印为空,则移除水印
981
+ if (page.value.watermark.text === '') {
982
+ const watermarkNode = pageNode.lastElementChild
983
+ if (
984
+ watermarkNode &&
985
+ !watermarkNode?.classList?.contains('umo-page-node-footer')
986
+ ) {
987
+ watermarkNode.remove()
988
+ }
989
+ }
990
+
991
+ // 移除菜单
992
+ const menuNodes = pageNode.querySelector('.umo-block-menu-drag-handle')
993
+ if (menuNodes) {
994
+ menuNodes.remove()
995
+ }
996
+
997
+ // 移除所有 html 注释
998
+ const htmlContent = pageNode.outerHTML.replace(/<!--[\s\S]*?-->/g, '')
999
+
1000
+ // 返回处理后的 html 内容
1001
+ return htmlContent
1002
+ }
1003
+
1004
+ const focus = (position = 'start', options = { scrollIntoView: true }) =>
1005
+ editor.value?.commands.focus(position, options)
1006
+
1007
+ const blur = () => editor.value?.chain().blur().run()
1008
+
1009
+ const print = () => {
1010
+ if (
1011
+ options.value.disableExtensions.includes('print') ||
1012
+ editor.value?.isEmpty
1013
+ ) {
1014
+ return
1015
+ }
1016
+ if (!options.value?.readOnly) {
1017
+ printing.value = true
1018
+ }
1019
+ }
1020
+
1021
+ const toggleFullscreen = (isFullscreen) => {
1022
+ if (isFullscreen !== undefined) {
1023
+ if (!isBoolean(isFullscreen)) {
1024
+ throw new Error('"isFullscreen" must be a boolean.')
1025
+ }
1026
+ fullscreen.value = isFullscreen
1027
+ return
1028
+ }
1029
+ fullscreen.value = !fullscreen.value
1030
+ }
1031
+
1032
+ const destroy = () => {
1033
+ editor.value?.unmount()
1034
+ removeAllHotkeys()
1035
+ destroyed.value = true
1036
+ }
1037
+
1038
+ // Content Saving Methods
1039
+ const saveContent = async (showMessage = true) => {
1040
+ if (options.value.document?.readOnly) {
1041
+ return
1042
+ }
1043
+ if (editor.value) {
1044
+ // 保存前先同步一份最新内容,避免 onSave 第三个参数读取到旧值
1045
+ $document.value.content = editor.value.getHTML()
1046
+ }
1047
+ const saveBack = {
1048
+ status: '', // 可选值:'success' | 'error' // 状态描述文本(用于前端提示或日志)
1049
+ message: '', // 例如:'保存失败:网络异常'
1050
+ showMessage: true, // 是否展示message
1051
+ }
1052
+ try {
1053
+ isSaving.value = true
1054
+ useMessage(
1055
+ 'loading',
1056
+ {
1057
+ attach: container.value,
1058
+ content: t('save.saving'),
1059
+ placement: 'bottom',
1060
+ closeBtn: true,
1061
+ duration: 0, // 需要手工关闭,不会自动关闭了
1062
+ offset: [0, -20],
1063
+ },
1064
+ getCurrentInstance(),
1065
+ )
1066
+ const _saveBack = await options.value?.onSave?.(
1067
+ {
1068
+ html: editor.value?.getHTML(),
1069
+ json: editor.value?.getJSON(),
1070
+ text: editor.value?.getText(),
1071
+ },
1072
+ page.value,
1073
+ $document.value,
1074
+ )
1075
+ if (!_saveBack) {
1076
+ throw new Error('`onSave` callback must return a value.')
1077
+ }
1078
+ // 兼容老的保存回调
1079
+ if (typeof _saveBack === 'string') {
1080
+ if (_saveBack) {
1081
+ saveBack.status = 'success'
1082
+ saveBack.message = _saveBack
1083
+ } else {
1084
+ saveBack.status = 'error'
1085
+ saveBack.message = _saveBack
1086
+ }
1087
+ } else {
1088
+ for (const key in _saveBack) {
1089
+ saveBack[key] = _saveBack[key]
1090
+ }
1091
+ // 没有返回这个
1092
+ if (_saveBack['showMessage'] === undefined) {
1093
+ saveBack['showMessage'] = showMessage
1094
+ }
1095
+ }
1096
+ MessagePlugin.closeAll()
1097
+ if (saveBack.status === 'error') {
1098
+ if (saveBack.showMessage) {
1099
+ useMessage('error', {
1100
+ attach: container.value,
1101
+ content: saveBack.message || t('save.failed'),
1102
+ placement: 'bottom',
1103
+ offset: [0, -20],
1104
+ })
1105
+ }
1106
+ return
1107
+ }
1108
+ emits('saved')
1109
+ contentUpdated.value = false
1110
+ if (saveBack.showMessage) {
1111
+ useMessage('success', {
1112
+ attach: container.value,
1113
+ content: saveBack.message || t('save.success'),
1114
+ placement: 'bottom',
1115
+ offset: [0, -20],
1116
+ })
1117
+ }
1118
+ const time = useTimestamp({ offset: 0 })
1119
+ savedAt.value = time.value
1120
+ } catch (error) {
1121
+ MessagePlugin.closeAll()
1122
+ if (saveBack.showMessage) {
1123
+ useMessage('error', {
1124
+ attach: container.value,
1125
+ content: error?.message ? error.message : t('save.error'),
1126
+ placement: 'bottom',
1127
+ offset: [0, -20],
1128
+ })
1129
+ }
1130
+ console.error(error?.message)
1131
+ } finally {
1132
+ isSaving.value = false
1133
+ }
1134
+ }
1135
+ const getAllBookmarks = () => {
1136
+ let bookmarkData
1137
+ editor.value?.commands.getAllBookmarks(function (_data) {
1138
+ bookmarkData = _data
1139
+ })
1140
+ return bookmarkData
1141
+ }
1142
+ const focusBookmark = (bookmarkName) => {
1143
+ return editor.value?.commands.focusBookmark(bookmarkName)
1144
+ }
1145
+ const setBookmark = (bookmarkName) => {
1146
+ return editor.value?.commands.setBookmark({ bookmarkName })
1147
+ }
1148
+ const deleteBookmark = (bookmarkName) => {
1149
+ if (!bookmarkName) {
1150
+ return false
1151
+ }
1152
+ const element = editor.value?.view.dom.querySelector(
1153
+ `bookmark[bookmarkName="${bookmarkName}"]`,
1154
+ )
1155
+ if (!element) {
1156
+ return false
1157
+ }
1158
+ const pos = editor.value?.view.posAtDOM(element, 0)
1159
+ const { tr } = editor.value?.view.state || {}
1160
+ if (!tr) {
1161
+ return false
1162
+ }
1163
+ const marks = editor.value?.view.state.doc.resolve(pos + 1)?.marks()
1164
+ if (marks !== null && marks.length > 0) {
1165
+ for (const mark of marks) {
1166
+ if (mark.type.name === 'bookmark') {
1167
+ editor.value?.view.dispatch(
1168
+ tr.removeMark(pos, pos + element.outerText.length, mark),
1169
+ )
1170
+ }
1171
+ }
1172
+ } else {
1173
+ editor.value?.view.dispatch(
1174
+ tr.removeMark(pos, pos + element.outerText.length),
1175
+ )
1176
+ }
1177
+ return true
1178
+ }
1179
+ // Content Excerpt Methods
1180
+ const getContentExcerpt = (charLimit = 100, more = ' ...') => {
1181
+ const text = editor.value?.getText()
1182
+ if (text?.length === 0) {
1183
+ return ''
1184
+ }
1185
+ return text?.substring(0, charLimit) + more
1186
+ }
1187
+ /* 撤销 重做操作*/
1188
+ const undoHistory = () => {
1189
+ undoHistoryRecord(historyRecords, function (record) {
1190
+ if (record?.type === 'editor') {
1191
+ editor?.value?.chain().focus().undo().run()
1192
+ } else if (record?.type === 'page' && record?.proType) {
1193
+ // 撤销
1194
+ if (page?.value && record.oldData !== undefined) {
1195
+ page.value[record.proType] = record.oldData
1196
+ }
1197
+ }
1198
+ })
1199
+ }
1200
+ const redoHistory = () => {
1201
+ redoHistoryRecord(historyRecords, function (record) {
1202
+ if (record?.type === 'editor') {
1203
+ editor?.value?.chain().focus().redo().run()
1204
+ } else if (record?.type === 'page' && record?.proType) {
1205
+ // 恢复
1206
+ if (page?.value && record.newData !== undefined) {
1207
+ page.value[record.proType] = record.newData
1208
+ }
1209
+ }
1210
+ })
1211
+ }
1212
+
1213
+ // Hotkeys Setup
1214
+ watch(
1215
+ () => editor.value,
1216
+ () => {
1217
+ const unsetFormatPainter = () => editor.value?.commands.unsetFormatPainter()
1218
+ const bindEscKey = () => {
1219
+ useHotkeys('esc', () => {
1220
+ if (page.value.preview) {
1221
+ page.value.preview.enabled = false
1222
+ }
1223
+ if (fullscreen.value) {
1224
+ fullscreen.value = false
1225
+ }
1226
+ })
1227
+ }
1228
+ const bindUndoRedoKey = () => {
1229
+ useHotkeys('ctrl+z, command+z', () => {
1230
+ undoHistory()
1231
+ })
1232
+ useHotkeys('ctrl+y, command+y', () => {
1233
+ redoHistory()
1234
+ })
1235
+ }
1236
+ editor.value?.on('focus', () => {
1237
+ useHotkeys('esc', unsetFormatPainter)
1238
+ useHotkeys('ctrl+s,command+s', () => {
1239
+ if (options?.value?.toolbar?.showSaveLabel) {
1240
+ saveContent()
1241
+ unsetFormatPainter()
1242
+ }
1243
+ })
1244
+ useHotkeys('ctrl+p,command+p', () => {
1245
+ print()
1246
+ unsetFormatPainter()
1247
+ })
1248
+ useHotkeys('ctrl+f, command+f', () => {
1249
+ searchReplace.value = true
1250
+ })
1251
+ })
1252
+ bindEscKey()
1253
+ bindUndoRedoKey()
1254
+ editor.value?.on('blur', () => {
1255
+ removeAllHotkeys()
1256
+ bindEscKey()
1257
+ bindUndoRedoKey()
1258
+ })
1259
+ },
1260
+ )
1261
+
1262
+ // Methods Exposed to Descendants
1263
+ provide('saveContent', saveContent)
1264
+
1265
+ provide('setTheme', setTheme)
1266
+ provide('setSkin', setSkin)
1267
+ provide('setLocale', setLocale)
1268
+ provide('getVanillaHTML', getVanillaHTML)
1269
+ provide('undoHistory', undoHistory)
1270
+ provide('redoHistory', redoHistory)
1271
+ // Exposing Methods
1272
+ defineExpose({
1273
+ getOptions: () => options.value,
1274
+ setOptions,
1275
+ setToolbar,
1276
+ setLayout,
1277
+ setPage,
1278
+ setWatermark,
1279
+ setDocument,
1280
+ setContent,
1281
+ insertContent,
1282
+ startTypewriter,
1283
+ stopTypewriter,
1284
+ getTypewriterState,
1285
+ setLocale,
1286
+ setTheme,
1287
+ setSkin,
1288
+ getPage: () => page.value,
1289
+ getContent,
1290
+ getImage,
1291
+ getText,
1292
+ getHTML,
1293
+ getJSON,
1294
+ getVanillaHTML,
1295
+ saveContent,
1296
+ getContentExcerpt,
1297
+ getEditor: () => editor,
1298
+ useEditor: () => editor.value,
1299
+ getTableOfContents: () => editor.value?.storage.tableOfContents.content,
1300
+ getSelectionText: () => (editor.value ? getSelectionText(editor.value) : ''),
1301
+ getSelectionNode: () =>
1302
+ editor.value ? getSelectionNode(editor.value) : null,
1303
+ deleteSelectionNode: () => editor.value?.commands.deleteSelectionNode(),
1304
+ setCurrentNodeSelection: () =>
1305
+ editor.value?.commands.setCurrentNodeSelection(),
1306
+ getLocale,
1307
+ getI18n,
1308
+ setReadOnly(readOnly = true) {
1309
+ if (options.value.document) {
1310
+ options.value.document.readOnly = readOnly
1311
+ }
1312
+ },
1313
+ print,
1314
+ focus,
1315
+ blur,
1316
+ toggleFullscreen,
1317
+ destroy,
1318
+ focusBookmark,
1319
+ getAllBookmarks,
1320
+ setBookmark,
1321
+ deleteBookmark,
1322
+ useAlert(pramas) {
1323
+ return useAlert({ attach: container.value, ...pramas })
1324
+ },
1325
+ useConfirm(pramas) {
1326
+ return useConfirm({ attach: container.value, ...pramas })
1327
+ },
1328
+ useMessage(type, pramas) {
1329
+ return useMessage(type, { attach: container.value, ...pramas })
1330
+ },
1331
+ })
1332
+ </script>
1333
+
1334
+ <style lang="less">
1335
+ @import '../assets/styles/index.less';
1336
+
1337
+ .umo-editor-container {
1338
+ --td-brand-color: var(--umo-primary-color);
1339
+ --td-warning-color: var(--umo-warning-color);
1340
+ --td-error-color: var(--umo-error-color);
1341
+ --td-text-color-primary: var(--umo-text-color);
1342
+ --td-text-color-disabled: var(--umo-text-color-disabled);
1343
+ width: 100%;
1344
+ height: 100%;
1345
+ min-height: 400px;
1346
+ display: flex;
1347
+ flex-direction: column;
1348
+ color: var(--umo-text-color);
1349
+ font-family: var(--umo-font-family);
1350
+ position: relative !important;
1351
+ background-color: var(--umo-container-background);
1352
+ .umo-footer {
1353
+ background-color: var(--umo-color-white);
1354
+ }
1355
+ &.umo-skin-default {
1356
+ .umo-toolbar {
1357
+ border-bottom: solid 1px var(--umo-border-color);
1358
+ background-color: var(--umo-color-white);
1359
+ }
1360
+ }
1361
+ &.umo-skin-default {
1362
+ .umo-toolbar {
1363
+ background-color: var(--umo-color-white);
1364
+ }
1365
+ }
1366
+ .umo-main {
1367
+ flex: 1;
1368
+ background-color: var(--umo-container-background);
1369
+ overflow: hidden;
1370
+ }
1371
+ &.preview-mode {
1372
+ &.laser-pointer {
1373
+ .umo-main {
1374
+ cursor: url('../assets/images/laser-pointer.svg'), auto;
1375
+ }
1376
+ }
1377
+ .umo-toolbar {
1378
+ display: none;
1379
+ }
1380
+ .umo-page-container {
1381
+ padding: 45px 0;
1382
+ }
1383
+ }
1384
+ &.umo-editor-is-fullscreen {
1385
+ position: fixed !important;
1386
+ top: 0;
1387
+ left: 0;
1388
+ right: 0;
1389
+ bottom: 0;
1390
+ background-color: var(--umo-container-background, #fff);
1391
+ }
1392
+ &.umo-editor-is-typerwriter-runing {
1393
+ pointer-events: none;
1394
+ }
1395
+ }
1396
+ </style>