editor-svg 1.0.0

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 (472) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintrc +46 -0
  3. package/.prettierrc +8 -0
  4. package/AGENTS.md +186 -0
  5. package/CHANGELOG.md +2543 -0
  6. package/CLAUDE.md +110 -0
  7. package/LICENSE +21 -0
  8. package/README.md +110 -0
  9. package/cypress/e2e/control/checkbox.cy.ts +46 -0
  10. package/cypress/e2e/control/select.cy.ts +56 -0
  11. package/cypress/e2e/control/text.cy.ts +43 -0
  12. package/cypress/e2e/editor.cy.ts +67 -0
  13. package/cypress/e2e/menus/block.cy.ts +38 -0
  14. package/cypress/e2e/menus/checkbox.cy.ts +33 -0
  15. package/cypress/e2e/menus/codeblock.cy.ts +34 -0
  16. package/cypress/e2e/menus/date.cy.ts +28 -0
  17. package/cypress/e2e/menus/format.cy.ts +40 -0
  18. package/cypress/e2e/menus/hyperlink.cy.ts +39 -0
  19. package/cypress/e2e/menus/image.cy.ts +25 -0
  20. package/cypress/e2e/menus/latex.cy.ts +34 -0
  21. package/cypress/e2e/menus/pagebreak.cy.ts +21 -0
  22. package/cypress/e2e/menus/painter.cy.ts +53 -0
  23. package/cypress/e2e/menus/print.cy.ts +25 -0
  24. package/cypress/e2e/menus/row.cy.ts +103 -0
  25. package/cypress/e2e/menus/search.cy.ts +112 -0
  26. package/cypress/e2e/menus/separator.cy.ts +32 -0
  27. package/cypress/e2e/menus/table.cy.ts +25 -0
  28. package/cypress/e2e/menus/text.cy.ts +304 -0
  29. package/cypress/e2e/menus/title.cy.ts +43 -0
  30. package/cypress/e2e/menus/undoRedo.cy.ts +49 -0
  31. package/cypress/e2e/menus/watermark.cy.ts +64 -0
  32. package/cypress/fixtures/example.json +3 -0
  33. package/cypress/fixtures/test.png +0 -0
  34. package/cypress/global.d.ts +13 -0
  35. package/cypress/support/commands.ts +5 -0
  36. package/cypress/support/e2e.ts +1 -0
  37. package/cypress/tsconfig.json +21 -0
  38. package/cypress.config.ts +10 -0
  39. package/docs/.vitepress/config.ts +191 -0
  40. package/docs/.vitepress/theme/components/DeepWikiBadge.vue +21 -0
  41. package/docs/.vitepress/theme/components/ZreadBadge.vue +21 -0
  42. package/docs/.vitepress/theme/index.ts +27 -0
  43. package/docs/en/guide/api-common.md +49 -0
  44. package/docs/en/guide/api-instance.md +34 -0
  45. package/docs/en/guide/command-execute.md +1167 -0
  46. package/docs/en/guide/command-get.md +355 -0
  47. package/docs/en/guide/contextmenu-custom.md +44 -0
  48. package/docs/en/guide/contextmenu-internal.md +61 -0
  49. package/docs/en/guide/eventbus.md +260 -0
  50. package/docs/en/guide/i18n.md +112 -0
  51. package/docs/en/guide/listener.md +126 -0
  52. package/docs/en/guide/option.md +214 -0
  53. package/docs/en/guide/override.md +57 -0
  54. package/docs/en/guide/plugin-custom.md +25 -0
  55. package/docs/en/guide/plugin-internal.md +125 -0
  56. package/docs/en/guide/schema.md +237 -0
  57. package/docs/en/guide/shortcut-custom.md +22 -0
  58. package/docs/en/guide/shortcut-internal.md +189 -0
  59. package/docs/en/guide/start.md +97 -0
  60. package/docs/en/index.md +43 -0
  61. package/docs/guide/api-common.md +49 -0
  62. package/docs/guide/api-instance.md +34 -0
  63. package/docs/guide/command-execute.md +1157 -0
  64. package/docs/guide/command-get.md +353 -0
  65. package/docs/guide/contextmenu-custom.md +44 -0
  66. package/docs/guide/contextmenu-internal.md +61 -0
  67. package/docs/guide/eventbus.md +260 -0
  68. package/docs/guide/i18n.md +111 -0
  69. package/docs/guide/listener.md +126 -0
  70. package/docs/guide/option.md +214 -0
  71. package/docs/guide/override.md +57 -0
  72. package/docs/guide/plugin-custom.md +25 -0
  73. package/docs/guide/plugin-internal.md +125 -0
  74. package/docs/guide/schema.md +237 -0
  75. package/docs/guide/shortcut-custom.md +22 -0
  76. package/docs/guide/shortcut-internal.md +189 -0
  77. package/docs/guide/start.md +97 -0
  78. package/docs/index.md +43 -0
  79. package/docs/public/favicon.png +0 -0
  80. package/favicon.png +0 -0
  81. package/index.html +435 -0
  82. package/package.json +55 -0
  83. package/pnpm-lock.yaml +4113 -0
  84. package/scripts/release.js +41 -0
  85. package/scripts/verifyCommit.js +19 -0
  86. package/src/assets/images/alignment.svg +1 -0
  87. package/src/assets/images/arrow-left.svg +1 -0
  88. package/src/assets/images/arrow-right.svg +1 -0
  89. package/src/assets/images/block.svg +1 -0
  90. package/src/assets/images/bold.svg +1 -0
  91. package/src/assets/images/catalog.svg +1 -0
  92. package/src/assets/images/center.svg +1 -0
  93. package/src/assets/images/checkbox.svg +1 -0
  94. package/src/assets/images/close.svg +1 -0
  95. package/src/assets/images/codeblock.svg +1 -0
  96. package/src/assets/images/color.svg +1 -0
  97. package/src/assets/images/control.svg +1 -0
  98. package/src/assets/images/date.svg +1 -0
  99. package/src/assets/images/exit-fullscreen.svg +1 -0
  100. package/src/assets/images/format.svg +1 -0
  101. package/src/assets/images/highlight.svg +1 -0
  102. package/src/assets/images/hyperlink.svg +1 -0
  103. package/src/assets/images/image.svg +1 -0
  104. package/src/assets/images/italic.svg +1 -0
  105. package/src/assets/images/justify.svg +7 -0
  106. package/src/assets/images/latex.svg +1 -0
  107. package/src/assets/images/left.svg +1 -0
  108. package/src/assets/images/line-dash-dot-dot.svg +1 -0
  109. package/src/assets/images/line-dash-dot.svg +1 -0
  110. package/src/assets/images/line-dash-large-gap.svg +1 -0
  111. package/src/assets/images/line-dash-small-gap.svg +1 -0
  112. package/src/assets/images/line-dot.svg +1 -0
  113. package/src/assets/images/line-double.svg +1 -0
  114. package/src/assets/images/line-single.svg +1 -0
  115. package/src/assets/images/line-wavy.svg +1 -0
  116. package/src/assets/images/list.svg +1 -0
  117. package/src/assets/images/option.svg +1 -0
  118. package/src/assets/images/page-break.svg +1 -0
  119. package/src/assets/images/page-mode.svg +1 -0
  120. package/src/assets/images/page-scale-add.svg +1 -0
  121. package/src/assets/images/page-scale-minus.svg +1 -0
  122. package/src/assets/images/painter.svg +1 -0
  123. package/src/assets/images/paper-direction.svg +1 -0
  124. package/src/assets/images/paper-margin.svg +1 -0
  125. package/src/assets/images/paper-size.svg +1 -0
  126. package/src/assets/images/print.svg +1 -0
  127. package/src/assets/images/radio.svg +4 -0
  128. package/src/assets/images/redo.svg +1 -0
  129. package/src/assets/images/request-fullscreen.svg +1 -0
  130. package/src/assets/images/right.svg +1 -0
  131. package/src/assets/images/row-margin.svg +1 -0
  132. package/src/assets/images/search.svg +1 -0
  133. package/src/assets/images/separator.svg +1 -0
  134. package/src/assets/images/signature-undo.svg +1 -0
  135. package/src/assets/images/signature.svg +1 -0
  136. package/src/assets/images/size-add.svg +1 -0
  137. package/src/assets/images/size-minus.svg +1 -0
  138. package/src/assets/images/strikeout.svg +1 -0
  139. package/src/assets/images/subscript.svg +1 -0
  140. package/src/assets/images/superscript.svg +1 -0
  141. package/src/assets/images/table.svg +1 -0
  142. package/src/assets/images/title.svg +1 -0
  143. package/src/assets/images/trash.svg +1 -0
  144. package/src/assets/images/underline.svg +1 -0
  145. package/src/assets/images/undo.svg +1 -0
  146. package/src/assets/images/watermark.svg +1 -0
  147. package/src/assets/images/word-tool.svg +1 -0
  148. package/src/assets/snapshots/main_v0.2.1.png +0 -0
  149. package/src/assets/snapshots/main_v0.2.2.png +0 -0
  150. package/src/assets/snapshots/main_v0.3.0.png +0 -0
  151. package/src/assets/snapshots/main_v0.3.1.png +0 -0
  152. package/src/assets/snapshots/main_v0.5.0.png +0 -0
  153. package/src/assets/snapshots/main_v0.5.1.png +0 -0
  154. package/src/assets/snapshots/main_v0.6.0.png +0 -0
  155. package/src/assets/snapshots/main_v0.6.1.png +0 -0
  156. package/src/assets/snapshots/main_v0.7.0.png +0 -0
  157. package/src/assets/snapshots/main_v0.7.1.png +0 -0
  158. package/src/assets/snapshots/main_v0.7.2.png +0 -0
  159. package/src/assets/snapshots/main_v0.7.3.png +0 -0
  160. package/src/assets/snapshots/main_v0.7.4.png +0 -0
  161. package/src/assets/snapshots/main_v0.7.6.png +0 -0
  162. package/src/assets/snapshots/main_v0.7.7.png +0 -0
  163. package/src/assets/snapshots/main_v0.8.0.png +0 -0
  164. package/src/assets/snapshots/main_v0.8.5.png +0 -0
  165. package/src/assets/snapshots/main_v0.8.6.png +0 -0
  166. package/src/assets/snapshots/main_v0.8.7.png +0 -0
  167. package/src/assets/snapshots/main_v0.8.8.png +0 -0
  168. package/src/assets/snapshots/main_v0.9.0.png +0 -0
  169. package/src/assets/snapshots/main_v0.9.1.png +0 -0
  170. package/src/assets/snapshots/main_v0.9.2.png +0 -0
  171. package/src/assets/snapshots/main_v0.9.23.png +0 -0
  172. package/src/assets/snapshots/main_v0.9.28.png +0 -0
  173. package/src/assets/snapshots/main_v0.9.29.png +0 -0
  174. package/src/assets/snapshots/main_v0.9.3.png +0 -0
  175. package/src/assets/snapshots/main_v0.9.30.png +0 -0
  176. package/src/assets/snapshots/main_v0.9.32.png +0 -0
  177. package/src/assets/snapshots/main_v0.9.35.png +0 -0
  178. package/src/assets/snapshots/main_v0.9.4.png +0 -0
  179. package/src/assets/snapshots/main_v0.9.5.png +0 -0
  180. package/src/assets/snapshots/main_v0.9.6.png +0 -0
  181. package/src/assets/snapshots/main_v0.9.8.png +0 -0
  182. package/src/components/dialog/Dialog.ts +171 -0
  183. package/src/components/dialog/dialog.css +131 -0
  184. package/src/components/signature/Signature.ts +340 -0
  185. package/src/components/signature/signature.css +132 -0
  186. package/src/editor/assets/css/block/block.css +21 -0
  187. package/src/editor/assets/css/contextmenu/contextmenu.css +196 -0
  188. package/src/editor/assets/css/control/calculator.css +85 -0
  189. package/src/editor/assets/css/control/select.css +44 -0
  190. package/src/editor/assets/css/date/datePicker.css +233 -0
  191. package/src/editor/assets/css/hyperlink/hyperlink.css +26 -0
  192. package/src/editor/assets/css/index.css +78 -0
  193. package/src/editor/assets/css/previewer/previewer.css +122 -0
  194. package/src/editor/assets/css/resizer/resizer.css +74 -0
  195. package/src/editor/assets/css/table/table.css +155 -0
  196. package/src/editor/assets/css/zone/zone.css +61 -0
  197. package/src/editor/assets/images/close.svg +1 -0
  198. package/src/editor/assets/images/delete-col.svg +1 -0
  199. package/src/editor/assets/images/delete-row-col.svg +1 -0
  200. package/src/editor/assets/images/delete-row.svg +1 -0
  201. package/src/editor/assets/images/delete-table.svg +1 -0
  202. package/src/editor/assets/images/image-change.svg +1 -0
  203. package/src/editor/assets/images/image-download.svg +1 -0
  204. package/src/editor/assets/images/image-next.svg +1 -0
  205. package/src/editor/assets/images/image-pre.svg +1 -0
  206. package/src/editor/assets/images/image.svg +1 -0
  207. package/src/editor/assets/images/insert-bottom-row.svg +1 -0
  208. package/src/editor/assets/images/insert-left-col.svg +1 -0
  209. package/src/editor/assets/images/insert-right-col.svg +1 -0
  210. package/src/editor/assets/images/insert-row-col.svg +1 -0
  211. package/src/editor/assets/images/insert-top-row.svg +1 -0
  212. package/src/editor/assets/images/merge-cancel-cell.svg +1 -0
  213. package/src/editor/assets/images/merge-cell.svg +1 -0
  214. package/src/editor/assets/images/original-size.svg +1 -0
  215. package/src/editor/assets/images/print.svg +1 -0
  216. package/src/editor/assets/images/rotate.svg +1 -0
  217. package/src/editor/assets/images/submenu-dropdown.svg +1 -0
  218. package/src/editor/assets/images/table-border-all.svg +1 -0
  219. package/src/editor/assets/images/table-border-dash.svg +1 -0
  220. package/src/editor/assets/images/table-border-empty.svg +1 -0
  221. package/src/editor/assets/images/table-border-external.svg +1 -0
  222. package/src/editor/assets/images/table-border-internal.svg +1 -0
  223. package/src/editor/assets/images/table-border-td-back.svg +1 -0
  224. package/src/editor/assets/images/table-border-td-bottom.svg +1 -0
  225. package/src/editor/assets/images/table-border-td-forward.svg +1 -0
  226. package/src/editor/assets/images/table-border-td-left.svg +1 -0
  227. package/src/editor/assets/images/table-border-td-right.svg +1 -0
  228. package/src/editor/assets/images/table-border-td-top.svg +1 -0
  229. package/src/editor/assets/images/table-border-td.svg +1 -0
  230. package/src/editor/assets/images/vertical-align-bottom.svg +1 -0
  231. package/src/editor/assets/images/vertical-align-middle.svg +1 -0
  232. package/src/editor/assets/images/vertical-align-top.svg +1 -0
  233. package/src/editor/assets/images/vertical-align.svg +1 -0
  234. package/src/editor/assets/images/zoom-in.svg +1 -0
  235. package/src/editor/assets/images/zoom-out.svg +1 -0
  236. package/src/editor/core/actuator/Actuator.ts +21 -0
  237. package/src/editor/core/actuator/handlers/positionContextChange.ts +13 -0
  238. package/src/editor/core/command/Command.ts +312 -0
  239. package/src/editor/core/command/CommandAdapt.ts +2733 -0
  240. package/src/editor/core/contextmenu/ContextMenu.ts +363 -0
  241. package/src/editor/core/contextmenu/menus/controlMenus.ts +25 -0
  242. package/src/editor/core/contextmenu/menus/globalMenus.ts +66 -0
  243. package/src/editor/core/contextmenu/menus/hyperlinkMenus.ts +58 -0
  244. package/src/editor/core/contextmenu/menus/imageMenus.ts +134 -0
  245. package/src/editor/core/contextmenu/menus/tableMenus.ts +331 -0
  246. package/src/editor/core/cursor/Cursor.ts +248 -0
  247. package/src/editor/core/cursor/CursorAgent.ts +75 -0
  248. package/src/editor/core/draw/Draw.ts +2934 -0
  249. package/src/editor/core/draw/control/Control.ts +1767 -0
  250. package/src/editor/core/draw/control/checkbox/CheckboxControl.ts +154 -0
  251. package/src/editor/core/draw/control/date/DateControl.ts +363 -0
  252. package/src/editor/core/draw/control/interactive/ControlSearch.ts +214 -0
  253. package/src/editor/core/draw/control/number/Calculator.ts +183 -0
  254. package/src/editor/core/draw/control/number/NumberControl.ts +183 -0
  255. package/src/editor/core/draw/control/radio/RadioControl.ts +68 -0
  256. package/src/editor/core/draw/control/richtext/Border.ts +52 -0
  257. package/src/editor/core/draw/control/select/SelectControl.ts +567 -0
  258. package/src/editor/core/draw/control/text/TextControl.ts +280 -0
  259. package/src/editor/core/draw/frame/Background.ts +117 -0
  260. package/src/editor/core/draw/frame/Badge.ts +88 -0
  261. package/src/editor/core/draw/frame/Footer.ts +155 -0
  262. package/src/editor/core/draw/frame/Header.ts +158 -0
  263. package/src/editor/core/draw/frame/LineNumber.ts +43 -0
  264. package/src/editor/core/draw/frame/Margin.ts +53 -0
  265. package/src/editor/core/draw/frame/PageBorder.ts +47 -0
  266. package/src/editor/core/draw/frame/PageNumber.ts +88 -0
  267. package/src/editor/core/draw/frame/Placeholder.ts +114 -0
  268. package/src/editor/core/draw/frame/Watermark.ts +188 -0
  269. package/src/editor/core/draw/graffiti/Graffiti.ts +125 -0
  270. package/src/editor/core/draw/interactive/Area.ts +312 -0
  271. package/src/editor/core/draw/interactive/Group.ts +198 -0
  272. package/src/editor/core/draw/interactive/Search.ts +527 -0
  273. package/src/editor/core/draw/particle/CheckboxParticle.ts +111 -0
  274. package/src/editor/core/draw/particle/HyperlinkParticle.ts +86 -0
  275. package/src/editor/core/draw/particle/ImageParticle.ts +280 -0
  276. package/src/editor/core/draw/particle/LabelParticle.ts +79 -0
  277. package/src/editor/core/draw/particle/LineBreakParticle.ts +55 -0
  278. package/src/editor/core/draw/particle/ListParticle.ts +255 -0
  279. package/src/editor/core/draw/particle/PageBreakParticle.ts +54 -0
  280. package/src/editor/core/draw/particle/RadioParticle.ts +99 -0
  281. package/src/editor/core/draw/particle/SeparatorParticle.ts +37 -0
  282. package/src/editor/core/draw/particle/SubscriptParticle.ts +23 -0
  283. package/src/editor/core/draw/particle/SuperscriptParticle.ts +23 -0
  284. package/src/editor/core/draw/particle/TextParticle.ts +174 -0
  285. package/src/editor/core/draw/particle/WhiteSpaceParticle.ts +32 -0
  286. package/src/editor/core/draw/particle/block/BlockParticle.ts +76 -0
  287. package/src/editor/core/draw/particle/block/modules/BaseBlock.ts +280 -0
  288. package/src/editor/core/draw/particle/block/modules/IFrameBlock.ts +47 -0
  289. package/src/editor/core/draw/particle/block/modules/VideoBlock.ts +61 -0
  290. package/src/editor/core/draw/particle/date/DateParticle.ts +111 -0
  291. package/src/editor/core/draw/particle/date/DatePicker.ts +577 -0
  292. package/src/editor/core/draw/particle/latex/LaTexParticle.ts +43 -0
  293. package/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts +1196 -0
  294. package/src/editor/core/draw/particle/latex/utils/hershey.ts +1632 -0
  295. package/src/editor/core/draw/particle/latex/utils/symbols.ts +318 -0
  296. package/src/editor/core/draw/particle/previewer/Previewer.ts +582 -0
  297. package/src/editor/core/draw/particle/table/TableOperate.ts +988 -0
  298. package/src/editor/core/draw/particle/table/TableParticle.ts +558 -0
  299. package/src/editor/core/draw/particle/table/TableTool.ts +551 -0
  300. package/src/editor/core/draw/richtext/AbstractRichText.ts +59 -0
  301. package/src/editor/core/draw/richtext/Highlight.ts +24 -0
  302. package/src/editor/core/draw/richtext/Strikeout.ts +28 -0
  303. package/src/editor/core/draw/richtext/Underline.ts +106 -0
  304. package/src/editor/core/event/CanvasEvent.ts +215 -0
  305. package/src/editor/core/event/GlobalEvent.ts +173 -0
  306. package/src/editor/core/event/eventbus/EventBus.ts +50 -0
  307. package/src/editor/core/event/handlers/click.ts +234 -0
  308. package/src/editor/core/event/handlers/composition.ts +45 -0
  309. package/src/editor/core/event/handlers/copy.ts +72 -0
  310. package/src/editor/core/event/handlers/cut.ts +47 -0
  311. package/src/editor/core/event/handlers/drag.ts +66 -0
  312. package/src/editor/core/event/handlers/drop.ts +28 -0
  313. package/src/editor/core/event/handlers/input.ts +129 -0
  314. package/src/editor/core/event/handlers/keydown/backspace.ts +161 -0
  315. package/src/editor/core/event/handlers/keydown/delete.ts +119 -0
  316. package/src/editor/core/event/handlers/keydown/end.ts +69 -0
  317. package/src/editor/core/event/handlers/keydown/enter.ts +126 -0
  318. package/src/editor/core/event/handlers/keydown/home.ts +69 -0
  319. package/src/editor/core/event/handlers/keydown/index.ts +85 -0
  320. package/src/editor/core/event/handlers/keydown/left.ts +162 -0
  321. package/src/editor/core/event/handlers/keydown/right.ts +178 -0
  322. package/src/editor/core/event/handlers/keydown/tab.ts +41 -0
  323. package/src/editor/core/event/handlers/keydown/updown.ts +342 -0
  324. package/src/editor/core/event/handlers/mousedown.ts +262 -0
  325. package/src/editor/core/event/handlers/mouseleave.ts +14 -0
  326. package/src/editor/core/event/handlers/mousemove.ts +133 -0
  327. package/src/editor/core/event/handlers/mouseup.ts +341 -0
  328. package/src/editor/core/event/handlers/paste.ts +231 -0
  329. package/src/editor/core/history/HistoryManager.ts +61 -0
  330. package/src/editor/core/i18n/I18n.ts +51 -0
  331. package/src/editor/core/i18n/lang/en.json +92 -0
  332. package/src/editor/core/i18n/lang/zh-CN.json +92 -0
  333. package/src/editor/core/listener/Listener.ts +41 -0
  334. package/src/editor/core/observer/ImageObserver.ts +19 -0
  335. package/src/editor/core/observer/MouseObserver.ts +56 -0
  336. package/src/editor/core/observer/ScrollObserver.ts +88 -0
  337. package/src/editor/core/observer/SelectionObserver.ts +143 -0
  338. package/src/editor/core/override/Override.ts +14 -0
  339. package/src/editor/core/plugin/Plugin.ts +17 -0
  340. package/src/editor/core/position/Position.ts +870 -0
  341. package/src/editor/core/range/RangeManager.ts +723 -0
  342. package/src/editor/core/register/Register.ts +28 -0
  343. package/src/editor/core/shortcut/Shortcut.ts +80 -0
  344. package/src/editor/core/shortcut/keys/listKeys.ts +22 -0
  345. package/src/editor/core/shortcut/keys/richtextKeys.ts +102 -0
  346. package/src/editor/core/shortcut/keys/titleKeys.ts +62 -0
  347. package/src/editor/core/worker/WorkerManager.ts +96 -0
  348. package/src/editor/core/worker/works/catalog.ts +189 -0
  349. package/src/editor/core/worker/works/group.ts +34 -0
  350. package/src/editor/core/worker/works/value.ts +32 -0
  351. package/src/editor/core/worker/works/wordCount.ts +132 -0
  352. package/src/editor/core/zone/Zone.ts +183 -0
  353. package/src/editor/core/zone/ZoneTip.ts +108 -0
  354. package/src/editor/dataset/constant/Background.ts +10 -0
  355. package/src/editor/dataset/constant/Badge.ts +6 -0
  356. package/src/editor/dataset/constant/Checkbox.ts +12 -0
  357. package/src/editor/dataset/constant/Common.ts +44 -0
  358. package/src/editor/dataset/constant/ContextMenu.ts +61 -0
  359. package/src/editor/dataset/constant/Control.ts +14 -0
  360. package/src/editor/dataset/constant/Cursor.ts +11 -0
  361. package/src/editor/dataset/constant/Editor.ts +19 -0
  362. package/src/editor/dataset/constant/Element.ts +173 -0
  363. package/src/editor/dataset/constant/Footer.ts +10 -0
  364. package/src/editor/dataset/constant/Graffiti.ts +6 -0
  365. package/src/editor/dataset/constant/Group.ts +10 -0
  366. package/src/editor/dataset/constant/Header.ts +10 -0
  367. package/src/editor/dataset/constant/ImgCaption.ts +8 -0
  368. package/src/editor/dataset/constant/Label.ts +8 -0
  369. package/src/editor/dataset/constant/LineBreak.ts +7 -0
  370. package/src/editor/dataset/constant/LineNumber.ts +11 -0
  371. package/src/editor/dataset/constant/List.ts +26 -0
  372. package/src/editor/dataset/constant/PageBorder.ts +8 -0
  373. package/src/editor/dataset/constant/PageBreak.ts +7 -0
  374. package/src/editor/dataset/constant/PageNumber.ts +22 -0
  375. package/src/editor/dataset/constant/Placeholder.ts +9 -0
  376. package/src/editor/dataset/constant/Radio.ts +12 -0
  377. package/src/editor/dataset/constant/Regular.ts +23 -0
  378. package/src/editor/dataset/constant/Separator.ts +6 -0
  379. package/src/editor/dataset/constant/Shortcut.ts +3 -0
  380. package/src/editor/dataset/constant/Table.ts +9 -0
  381. package/src/editor/dataset/constant/Title.ts +38 -0
  382. package/src/editor/dataset/constant/Watermark.ts +17 -0
  383. package/src/editor/dataset/constant/WhiteSpace.ts +7 -0
  384. package/src/editor/dataset/constant/Zone.ts +5 -0
  385. package/src/editor/dataset/enum/Area.ts +5 -0
  386. package/src/editor/dataset/enum/Background.ts +11 -0
  387. package/src/editor/dataset/enum/Block.ts +4 -0
  388. package/src/editor/dataset/enum/Common.ts +30 -0
  389. package/src/editor/dataset/enum/Control.ts +39 -0
  390. package/src/editor/dataset/enum/Editor.ts +51 -0
  391. package/src/editor/dataset/enum/Element.ts +21 -0
  392. package/src/editor/dataset/enum/ElementStyle.ts +12 -0
  393. package/src/editor/dataset/enum/Event.ts +5 -0
  394. package/src/editor/dataset/enum/KeyMap.ts +85 -0
  395. package/src/editor/dataset/enum/LineNumber.ts +4 -0
  396. package/src/editor/dataset/enum/List.ts +23 -0
  397. package/src/editor/dataset/enum/Observer.ts +6 -0
  398. package/src/editor/dataset/enum/Row.ts +7 -0
  399. package/src/editor/dataset/enum/Text.ts +13 -0
  400. package/src/editor/dataset/enum/Title.ts +8 -0
  401. package/src/editor/dataset/enum/VerticalAlign.ts +5 -0
  402. package/src/editor/dataset/enum/Watermark.ts +4 -0
  403. package/src/editor/dataset/enum/table/Table.ts +19 -0
  404. package/src/editor/dataset/enum/table/TableTool.ts +4 -0
  405. package/src/editor/index.ts +241 -0
  406. package/src/editor/interface/Area.ts +68 -0
  407. package/src/editor/interface/Background.ts +9 -0
  408. package/src/editor/interface/Badge.ts +17 -0
  409. package/src/editor/interface/Block.ts +18 -0
  410. package/src/editor/interface/Catalog.ts +11 -0
  411. package/src/editor/interface/Checkbox.ts +17 -0
  412. package/src/editor/interface/Command.ts +3 -0
  413. package/src/editor/interface/Common.ts +43 -0
  414. package/src/editor/interface/Control.ts +250 -0
  415. package/src/editor/interface/Cursor.ts +7 -0
  416. package/src/editor/interface/Draw.ts +86 -0
  417. package/src/editor/interface/Editor.ts +172 -0
  418. package/src/editor/interface/Element.ts +273 -0
  419. package/src/editor/interface/Event.ts +27 -0
  420. package/src/editor/interface/EventBus.ts +46 -0
  421. package/src/editor/interface/Footer.ts +9 -0
  422. package/src/editor/interface/Graffiti.ts +15 -0
  423. package/src/editor/interface/Group.ts +8 -0
  424. package/src/editor/interface/Header.ts +9 -0
  425. package/src/editor/interface/Label.ts +8 -0
  426. package/src/editor/interface/LineBreak.ts +5 -0
  427. package/src/editor/interface/LineNumber.ts +10 -0
  428. package/src/editor/interface/Listener.ts +88 -0
  429. package/src/editor/interface/Margin.ts +1 -0
  430. package/src/editor/interface/PageBorder.ts +8 -0
  431. package/src/editor/interface/PageBreak.ts +5 -0
  432. package/src/editor/interface/PageNumber.ts +16 -0
  433. package/src/editor/interface/Placeholder.ts +7 -0
  434. package/src/editor/interface/Plugin.ts +8 -0
  435. package/src/editor/interface/Position.ts +113 -0
  436. package/src/editor/interface/Previewer.ts +15 -0
  437. package/src/editor/interface/Radio.ts +17 -0
  438. package/src/editor/interface/Range.ts +61 -0
  439. package/src/editor/interface/Row.ts +25 -0
  440. package/src/editor/interface/Search.ts +36 -0
  441. package/src/editor/interface/Separator.ts +4 -0
  442. package/src/editor/interface/Text.ts +15 -0
  443. package/src/editor/interface/Title.ts +32 -0
  444. package/src/editor/interface/Watermark.ts +16 -0
  445. package/src/editor/interface/WhiteSpace.ts +5 -0
  446. package/src/editor/interface/Zone.ts +3 -0
  447. package/src/editor/interface/contextmenu/ContextMenu.ts +76 -0
  448. package/src/editor/interface/i18n/I18n.ts +7 -0
  449. package/src/editor/interface/shortcut/Shortcut.ts +14 -0
  450. package/src/editor/interface/table/Colgroup.ts +4 -0
  451. package/src/editor/interface/table/Table.ts +9 -0
  452. package/src/editor/interface/table/Td.ts +36 -0
  453. package/src/editor/interface/table/Tr.ts +11 -0
  454. package/src/editor/types/index.d.ts +5 -0
  455. package/src/editor/utils/clipboard.ts +94 -0
  456. package/src/editor/utils/element.ts +1877 -0
  457. package/src/editor/utils/hotkey.ts +5 -0
  458. package/src/editor/utils/index.ts +445 -0
  459. package/src/editor/utils/option.ts +253 -0
  460. package/src/editor/utils/paragraph.ts +28 -0
  461. package/src/editor/utils/print.ts +99 -0
  462. package/src/editor/utils/ua.ts +13 -0
  463. package/src/main.ts +2053 -0
  464. package/src/mock.ts +611 -0
  465. package/src/plugins/copy/index.ts +30 -0
  466. package/src/plugins/markdown/index.ts +118 -0
  467. package/src/style.css +1079 -0
  468. package/src/utils/index.ts +45 -0
  469. package/src/utils/prism.ts +89 -0
  470. package/src/vite-env.d.ts +1 -0
  471. package/tsconfig.json +25 -0
  472. package/vite.config.ts +46 -0
@@ -0,0 +1,5 @@
1
+ import { isApple } from './ua'
2
+
3
+ export function isMod(evt: KeyboardEvent | MouseEvent) {
4
+ return isApple ? evt.metaKey : evt.ctrlKey
5
+ }
@@ -0,0 +1,445 @@
1
+ import { UNICODE_SYMBOL_REG } from '../dataset/constant/Regular'
2
+ import { IElementFillRect } from '../interface/Element'
3
+
4
+ export function debounce<T extends unknown[]>(
5
+ func: (...arg: T) => unknown,
6
+ delay: number
7
+ ) {
8
+ let timer: number
9
+ return function (this: unknown, ...args: T) {
10
+ if (timer) {
11
+ window.clearTimeout(timer)
12
+ }
13
+ timer = window.setTimeout(() => {
14
+ func.apply(this, args)
15
+ }, delay)
16
+ }
17
+ }
18
+
19
+ export function throttle<T extends unknown[]>(
20
+ func: (...arg: T) => unknown,
21
+ delay: number
22
+ ) {
23
+ let lastExecTime = 0
24
+ let timer: number
25
+ return function (this: unknown, ...args: T) {
26
+ const currentTime = Date.now()
27
+ if (currentTime - lastExecTime >= delay) {
28
+ window.clearTimeout(timer)
29
+ func.apply(this, args)
30
+ lastExecTime = currentTime
31
+ } else {
32
+ window.clearTimeout(timer)
33
+ timer = window.setTimeout(() => {
34
+ func.apply(this, args)
35
+ lastExecTime = currentTime
36
+ }, delay)
37
+ }
38
+ }
39
+ }
40
+
41
+ export function deepCloneOmitKeys<T, K>(obj: T, omitKeys: (keyof K)[]): T {
42
+ if (!obj || typeof obj !== 'object') {
43
+ return obj
44
+ }
45
+ let newObj = {} as T
46
+ if (Array.isArray(obj)) {
47
+ newObj = obj.map(item => deepCloneOmitKeys(item, omitKeys)) as T
48
+ } else {
49
+ // prettier-ignore
50
+ (Object.keys(obj) as (keyof T)[]).forEach(key => {
51
+ if (omitKeys.includes(key as unknown as keyof K)) return
52
+ newObj[key] = deepCloneOmitKeys(obj[key] , omitKeys)
53
+ })
54
+ }
55
+ return newObj
56
+ }
57
+
58
+ export function deepClone<T>(obj: T): T {
59
+ if (typeof structuredClone === 'function') {
60
+ return structuredClone(obj)
61
+ }
62
+ if (!obj || typeof obj !== 'object') {
63
+ return obj
64
+ }
65
+ let newObj = {} as T
66
+ if (Array.isArray(obj)) {
67
+ newObj = obj.map(item => deepClone(item)) as T
68
+ } else {
69
+ // prettier-ignore
70
+ (Object.keys(obj) as (keyof T)[]).forEach(key => {
71
+ newObj[key] = deepClone(obj[key])
72
+ })
73
+ }
74
+ return newObj
75
+ }
76
+
77
+ export function isBody(node: Element): boolean {
78
+ return node && node.nodeType === 1 && node.tagName.toLowerCase() === 'body'
79
+ }
80
+
81
+ export function findParent(
82
+ node: Element,
83
+ filterFn: Function,
84
+ includeSelf: boolean
85
+ ) {
86
+ if (node && !isBody(node)) {
87
+ node = includeSelf ? node : (node.parentNode as Element)
88
+ while (node) {
89
+ if (!filterFn || filterFn(node) || isBody(node)) {
90
+ return filterFn && !filterFn(node) && isBody(node) ? null : node
91
+ }
92
+ node = node.parentNode as Element
93
+ }
94
+ }
95
+ return null
96
+ }
97
+
98
+ export function getUUID(): string {
99
+ function S4(): string {
100
+ return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
101
+ }
102
+ return (
103
+ S4() +
104
+ S4() +
105
+ '-' +
106
+ S4() +
107
+ '-' +
108
+ S4() +
109
+ '-' +
110
+ S4() +
111
+ '-' +
112
+ S4() +
113
+ S4() +
114
+ S4()
115
+ )
116
+ }
117
+
118
+ export function splitText(text: string): string[] {
119
+ const data: string[] = []
120
+ if (Intl.Segmenter) {
121
+ const segmenter = new Intl.Segmenter()
122
+ const segments = segmenter.segment(text)
123
+ for (const { segment } of segments) {
124
+ data.push(segment)
125
+ }
126
+ } else {
127
+ const symbolMap = new Map<number, string>()
128
+ for (const match of text.matchAll(UNICODE_SYMBOL_REG)) {
129
+ symbolMap.set(match.index!, match[0])
130
+ }
131
+ let t = 0
132
+ while (t < text.length) {
133
+ const symbol = symbolMap.get(t)
134
+ if (symbol) {
135
+ data.push(symbol)
136
+ t += symbol.length
137
+ } else {
138
+ data.push(text[t])
139
+ t++
140
+ }
141
+ }
142
+ }
143
+ return data
144
+ }
145
+
146
+ export function downloadFile(href: string, fileName: string) {
147
+ const a = document.createElement('a')
148
+ a.href = href
149
+ a.download = fileName
150
+ a.click()
151
+ }
152
+
153
+ export function threeClick(dom: HTMLElement, fn: (evt: MouseEvent) => void) {
154
+ nClickEvent(3, dom, fn)
155
+ }
156
+
157
+ function nClickEvent(
158
+ n: number,
159
+ dom: HTMLElement,
160
+ fn: (evt: MouseEvent) => void
161
+ ) {
162
+ let count = 0
163
+ let lastTime = 0
164
+
165
+ const handler = function (evt: MouseEvent) {
166
+ const currentTime = new Date().getTime()
167
+ count = currentTime - lastTime < 300 ? count + 1 : 0
168
+ lastTime = new Date().getTime()
169
+ if (count >= n - 1) {
170
+ fn(evt)
171
+ count = 0
172
+ }
173
+ }
174
+
175
+ dom.addEventListener('click', handler)
176
+ }
177
+
178
+ export function isObject(type: unknown): type is Record<string, unknown> {
179
+ return Object.prototype.toString.call(type) === '[object Object]'
180
+ }
181
+
182
+ export function isArray(type: unknown): type is Array<unknown> {
183
+ return Array.isArray(type)
184
+ }
185
+
186
+ export function isNumber(type: unknown): type is number {
187
+ return Object.prototype.toString.call(type) === '[object Number]'
188
+ }
189
+
190
+ export function isString(type: unknown): type is string {
191
+ return Object.prototype.toString.call(type) === '[object String]'
192
+ }
193
+
194
+ export function mergeObject<T>(source: T, target: T): T {
195
+ if (isObject(source) && isObject(target)) {
196
+ const objectTarget = <Record<string, unknown>>target
197
+ for (const [key, val] of Object.entries(source)) {
198
+ if (!objectTarget[key]) {
199
+ objectTarget[key] = val
200
+ } else {
201
+ objectTarget[key] = mergeObject(val, objectTarget[key])
202
+ }
203
+ }
204
+ } else if (isArray(source) && isArray(target)) {
205
+ target.push(...source)
206
+ }
207
+ return target
208
+ }
209
+
210
+ export function nextTick(fn: Function) {
211
+ setTimeout(() => {
212
+ fn()
213
+ }, 0)
214
+ }
215
+
216
+ export function convertNumberToChinese(num: number) {
217
+ const chineseNum = [
218
+ '零',
219
+ '一',
220
+ '二',
221
+ '三',
222
+ '四',
223
+ '五',
224
+ '六',
225
+ '七',
226
+ '八',
227
+ '九'
228
+ ]
229
+ const chineseUnit = [
230
+ '',
231
+ '十',
232
+ '百',
233
+ '千',
234
+ '万',
235
+ '十',
236
+ '百',
237
+ '千',
238
+ '亿',
239
+ '十',
240
+ '百',
241
+ '千',
242
+ '万',
243
+ '十',
244
+ '百',
245
+ '千',
246
+ '亿'
247
+ ]
248
+ if (!num || isNaN(num)) return '零'
249
+ const numStr = num.toString().split('')
250
+ let result = ''
251
+ for (let i = 0; i < numStr.length; i++) {
252
+ const desIndex = numStr.length - 1 - i
253
+ result = `${chineseUnit[i]}${result}`
254
+ result = `${chineseNum[Number(numStr[desIndex])]}${result}`
255
+ }
256
+ result = result.replace(/零(千|百|十)/g, '零').replace(/十零/g, '十')
257
+ result = result.replace(/零+/g, '零')
258
+ result = result.replace(/零亿/g, '亿').replace(/零万/g, '万')
259
+ result = result.replace(/亿万/g, '亿')
260
+ result = result.replace(/零+$/, '')
261
+ result = result.replace(/^一十/g, '十')
262
+ return result
263
+ }
264
+
265
+ export function cloneProperty<T>(
266
+ properties: (keyof T)[],
267
+ sourceElement: T,
268
+ targetElement: T
269
+ ) {
270
+ for (let i = 0; i < properties.length; i++) {
271
+ const property = properties[i]
272
+ const value = sourceElement[property]
273
+ if (value !== undefined) {
274
+ targetElement[property] = value
275
+ } else {
276
+ delete targetElement[property]
277
+ }
278
+ }
279
+ }
280
+
281
+ export function deleteProperty<T>(sourceKeys: T[], deleteKeys: T[]) {
282
+ if (!deleteKeys.length || !sourceKeys.length) return
283
+ for (let i = sourceKeys.length - 1; i >= 0; i--) {
284
+ if (deleteKeys.includes(sourceKeys[i])) {
285
+ sourceKeys.splice(i, 1)
286
+ }
287
+ }
288
+ }
289
+
290
+ export function pickObject<T>(object: T, pickKeys: (keyof T)[]): T {
291
+ const newObject: T = <T>{}
292
+ for (const key in object) {
293
+ if (pickKeys.includes(key)) {
294
+ newObject[key] = object[key]
295
+ }
296
+ }
297
+ return newObject
298
+ }
299
+
300
+ export function omitObject<T>(object: T, omitKeys: (keyof T)[]): T {
301
+ const newObject: T = <T>{}
302
+ for (const key in object) {
303
+ if (!omitKeys.includes(key)) {
304
+ newObject[key] = object[key]
305
+ }
306
+ }
307
+ return newObject
308
+ }
309
+
310
+ export function convertStringToBase64(input: string) {
311
+ const encoder = new TextEncoder()
312
+ const data = encoder.encode(input)
313
+ const charArray = Array.from(data, byte => String.fromCharCode(byte))
314
+ const base64 = window.btoa(charArray.join(''))
315
+ return base64
316
+ }
317
+
318
+ export function findScrollContainer(element: HTMLElement) {
319
+ let parent = element.parentElement
320
+ while (parent) {
321
+ const style = window.getComputedStyle(parent)
322
+ const overflowY = style.getPropertyValue('overflow-y')
323
+ if (
324
+ parent.scrollHeight > parent.clientHeight &&
325
+ (overflowY === 'auto' || overflowY === 'scroll')
326
+ ) {
327
+ return parent
328
+ }
329
+ parent = parent.parentElement
330
+ }
331
+ return document.documentElement
332
+ }
333
+
334
+ export function isArrayEqual(arr1: unknown[], arr2: unknown[]): boolean {
335
+ if (arr1.length !== arr2.length) {
336
+ return false
337
+ }
338
+ return !arr1.some(item => !arr2.includes(item))
339
+ }
340
+
341
+ export function isObjectEqual(obj1: unknown, obj2: unknown): boolean {
342
+ if (!isObject(obj1) || !isObject(obj2)) return false
343
+ const obj1Keys = Object.keys(obj1)
344
+ const obj2Keys = Object.keys(obj2)
345
+ if (obj1Keys.length !== obj2Keys.length) {
346
+ return false
347
+ }
348
+ return !obj1Keys.some(key => obj2[key] !== obj1[key])
349
+ }
350
+
351
+ export function isRectIntersect(
352
+ rect1: IElementFillRect,
353
+ rect2: IElementFillRect
354
+ ): boolean {
355
+ const rect1Left = rect1.x
356
+ const rect1Right = rect1.x + rect1.width
357
+ const rect1Top = rect1.y
358
+ const rect1Bottom = rect1.y + rect1.height
359
+ const rect2Left = rect2.x
360
+ const rect2Right = rect2.x + rect2.width
361
+ const rect2Top = rect2.y
362
+ const rect2Bottom = rect2.y + rect2.height
363
+ if (
364
+ rect1Left > rect2Right ||
365
+ rect1Right < rect2Left ||
366
+ rect1Top > rect2Bottom ||
367
+ rect1Bottom < rect2Top
368
+ ) {
369
+ return false
370
+ }
371
+ return true
372
+ }
373
+
374
+ export function isNonValue(value: unknown): boolean {
375
+ return value === undefined || value === null
376
+ }
377
+
378
+ export function normalizeLineBreak(text: string): string {
379
+ return text.replace(/\r\n|\r/g, '\n')
380
+ }
381
+
382
+ // 支持正则的indexOf
383
+ export function indexOf(
384
+ source: string,
385
+ search: string | RegExp,
386
+ fromIndex = 0
387
+ ): { index: number; length: number } {
388
+ const start = Math.max(0, Math.floor(fromIndex))
389
+
390
+ if (start >= source.length) {
391
+ if (typeof search === 'string' && search === '') {
392
+ return { index: source.length, length: 0 }
393
+ }
394
+ return { index: -1, length: 0 }
395
+ }
396
+
397
+ // 关键词匹配
398
+ if (typeof search === 'string') {
399
+ if (search === '') {
400
+ return { index: start, length: 0 }
401
+ }
402
+ const index = source.indexOf(search, start)
403
+ return index === -1
404
+ ? { index: -1, length: 0 }
405
+ : { index, length: search.length }
406
+ }
407
+
408
+ // 确保正则包含 "g" 才可以设置 lastIndex,从而从任意位置开始搜索
409
+ const originalFlags = search.flags
410
+ const flags = originalFlags.includes('g')
411
+ ? originalFlags
412
+ : originalFlags + 'g'
413
+ const re = new RegExp(search.source, flags)
414
+ re.lastIndex = start
415
+ const match = re.exec(source)
416
+ if (!match) {
417
+ return { index: -1, length: 0 }
418
+ }
419
+ return { index: match.index, length: match[0].length }
420
+ }
421
+
422
+ // 滚动到可视视野范围
423
+ export function scrollIntoView(container: HTMLElement, selected: HTMLElement) {
424
+ if (!selected) {
425
+ container.scrollTop = 0
426
+ return
427
+ }
428
+ const offsetParents: HTMLElement[] = []
429
+ let pointer = <HTMLElement>selected.offsetParent
430
+ while (pointer && container !== pointer && container.contains(pointer)) {
431
+ offsetParents.push(pointer)
432
+ pointer = <HTMLElement>pointer.offsetParent
433
+ }
434
+ const top =
435
+ selected.offsetTop +
436
+ offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0)
437
+ const bottom = top + selected.offsetHeight
438
+ const viewRectTop = container.scrollTop
439
+ const viewRectBottom = viewRectTop + container.clientHeight
440
+ if (top < viewRectTop) {
441
+ container.scrollTop = top
442
+ } else if (bottom > viewRectBottom) {
443
+ container.scrollTop = bottom - container.clientHeight
444
+ }
445
+ }
@@ -0,0 +1,253 @@
1
+ import { defaultBackground } from '../dataset/constant/Background'
2
+ import { defaultCheckboxOption } from '../dataset/constant/Checkbox'
3
+ import { LETTER_CLASS } from '../dataset/constant/Common'
4
+ import { defaultControlOption } from '../dataset/constant/Control'
5
+ import { defaultCursorOption } from '../dataset/constant/Cursor'
6
+ import { defaultFooterOption } from '../dataset/constant/Footer'
7
+ import { defaultGroupOption } from '../dataset/constant/Group'
8
+ import { defaultHeaderOption } from '../dataset/constant/Header'
9
+ import { defaultLabelOption } from '../dataset/constant/Label'
10
+ import { defaultImgCaptionOption } from '../dataset/constant/ImgCaption'
11
+ import { defaultLineBreak } from '../dataset/constant/LineBreak'
12
+ import { defaultPageBreakOption } from '../dataset/constant/PageBreak'
13
+ import { defaultPageNumberOption } from '../dataset/constant/PageNumber'
14
+ import { defaultPlaceholderOption } from '../dataset/constant/Placeholder'
15
+ import { defaultRadioOption } from '../dataset/constant/Radio'
16
+ import { defaultSeparatorOption } from '../dataset/constant/Separator'
17
+ import { defaultTableOption } from '../dataset/constant/Table'
18
+ import { defaultTitleOption } from '../dataset/constant/Title'
19
+ import { defaultWatermarkOption } from '../dataset/constant/Watermark'
20
+ import { defaultZoneOption } from '../dataset/constant/Zone'
21
+ import { defaultLineNumberOption } from '../dataset/constant/LineNumber'
22
+ import { defaultListOption } from '../dataset/constant/List'
23
+ import { IBackgroundOption } from '../interface/Background'
24
+ import { ICheckboxOption } from '../interface/Checkbox'
25
+ import { DeepRequired } from '../interface/Common'
26
+ import { IControlOption } from '../interface/Control'
27
+ import { ICursorOption } from '../interface/Cursor'
28
+ import { IEditorOption, IModeRule } from '../interface/Editor'
29
+ import { IFooter } from '../interface/Footer'
30
+ import { IGroup } from '../interface/Group'
31
+ import { IHeader } from '../interface/Header'
32
+ import { ILabelOption } from '../interface/Label'
33
+ import { IImgCaptionOption, IListOption } from '../interface/Element'
34
+ import { ILineBreakOption } from '../interface/LineBreak'
35
+ import { IPageBreak } from '../interface/PageBreak'
36
+ import { IPageNumber } from '../interface/PageNumber'
37
+ import { IPlaceholder } from '../interface/Placeholder'
38
+ import { IRadioOption } from '../interface/Radio'
39
+ import { ISeparatorOption } from '../interface/Separator'
40
+ import { ITableOption } from '../interface/table/Table'
41
+ import { ITitleOption } from '../interface/Title'
42
+ import { IWatermark } from '../interface/Watermark'
43
+ import { IZoneOption } from '../interface/Zone'
44
+ import { ILineNumberOption } from '../interface/LineNumber'
45
+ import { IPageBorderOption } from '../interface/PageBorder'
46
+ import { defaultPageBorderOption } from '../dataset/constant/PageBorder'
47
+ import {
48
+ EditorMode,
49
+ PageMode,
50
+ PaperDirection,
51
+ RenderMode,
52
+ WordBreak
53
+ } from '../dataset/enum/Editor'
54
+ import { defaultBadgeOption } from '../dataset/constant/Badge'
55
+ import { IBadgeOption } from '../interface/Badge'
56
+ import { defaultModeRuleOption } from '../dataset/constant/Editor'
57
+ import { IGraffitiOption } from '../interface/Graffiti'
58
+ import { defaultGraffitiOption } from '../dataset/constant/Graffiti'
59
+ import { IWhiteSpaceOption } from '../interface/WhiteSpace'
60
+ import { defaultWhiteSpaceOption } from '../dataset/constant/WhiteSpace'
61
+
62
+ export function mergeOption(
63
+ options: IEditorOption = {}
64
+ ): DeepRequired<IEditorOption> {
65
+ const tableOptions: Required<ITableOption> = {
66
+ ...defaultTableOption,
67
+ ...options.table
68
+ }
69
+ const headerOptions: Required<IHeader> = {
70
+ ...defaultHeaderOption,
71
+ ...options.header
72
+ }
73
+ const footerOptions: Required<IFooter> = {
74
+ ...defaultFooterOption,
75
+ ...options.footer
76
+ }
77
+ const pageNumberOptions: Required<IPageNumber> = {
78
+ ...defaultPageNumberOption,
79
+ ...options.pageNumber
80
+ }
81
+ const waterMarkOptions: Required<IWatermark> = {
82
+ ...defaultWatermarkOption,
83
+ ...options.watermark
84
+ }
85
+ const controlOptions: Required<IControlOption> = {
86
+ ...defaultControlOption,
87
+ ...options.control
88
+ }
89
+ const checkboxOptions: Required<ICheckboxOption> = {
90
+ ...defaultCheckboxOption,
91
+ ...options.checkbox
92
+ }
93
+ const radioOptions: Required<IRadioOption> = {
94
+ ...defaultRadioOption,
95
+ ...options.radio
96
+ }
97
+ const cursorOptions: Required<ICursorOption> = {
98
+ ...defaultCursorOption,
99
+ ...options.cursor
100
+ }
101
+ const titleOptions: Required<ITitleOption> = {
102
+ ...defaultTitleOption,
103
+ ...options.title
104
+ }
105
+ const placeholderOptions: Required<IPlaceholder> = {
106
+ ...defaultPlaceholderOption,
107
+ ...options.placeholder
108
+ }
109
+ const groupOptions: Required<IGroup> = {
110
+ ...defaultGroupOption,
111
+ ...options.group
112
+ }
113
+ const pageBreakOptions: Required<IPageBreak> = {
114
+ ...defaultPageBreakOption,
115
+ ...options.pageBreak
116
+ }
117
+ const zoneOptions: Required<IZoneOption> = {
118
+ ...defaultZoneOption,
119
+ ...options.zone
120
+ }
121
+ const backgroundOptions: Required<IBackgroundOption> = {
122
+ ...defaultBackground,
123
+ ...options.background
124
+ }
125
+ const lineBreakOptions: Required<ILineBreakOption> = {
126
+ ...defaultLineBreak,
127
+ ...options.lineBreak
128
+ }
129
+ const whiteSpaceOptions: Required<IWhiteSpaceOption> = {
130
+ ...defaultWhiteSpaceOption,
131
+ ...options.whiteSpace
132
+ }
133
+ const separatorOptions: Required<ISeparatorOption> = {
134
+ ...defaultSeparatorOption,
135
+ ...options.separator
136
+ }
137
+ const lineNumberOptions: Required<ILineNumberOption> = {
138
+ ...defaultLineNumberOption,
139
+ ...options.lineNumber
140
+ }
141
+ const pageBorderOptions: Required<IPageBorderOption> = {
142
+ ...defaultPageBorderOption,
143
+ ...options.pageBorder
144
+ }
145
+ const badgeOptions: Required<IBadgeOption> = {
146
+ ...defaultBadgeOption,
147
+ ...options.badge
148
+ }
149
+ const graffitiOptions: Required<IGraffitiOption> = {
150
+ ...defaultGraffitiOption,
151
+ ...options.graffiti
152
+ }
153
+ const labelOptions: Required<ILabelOption> = {
154
+ ...defaultLabelOption,
155
+ ...options.label
156
+ }
157
+ const imgCaptionOptions: Required<IImgCaptionOption> = {
158
+ ...defaultImgCaptionOption,
159
+ ...options.imgCaption
160
+ }
161
+ const listOptions: Required<IListOption> = {
162
+ ...defaultListOption,
163
+ ...options.list
164
+ }
165
+ const modeRuleOption: DeepRequired<IModeRule> = {
166
+ print: {
167
+ ...defaultModeRuleOption.print,
168
+ ...options.modeRule?.print
169
+ },
170
+ readonly: {
171
+ ...defaultModeRuleOption.readonly,
172
+ ...options.modeRule?.readonly
173
+ },
174
+ form: {
175
+ ...defaultModeRuleOption.form,
176
+ ...options.modeRule?.form
177
+ }
178
+ }
179
+
180
+ return {
181
+ mode: EditorMode.EDIT,
182
+ locale: 'zhCN',
183
+ defaultType: 'TEXT',
184
+ defaultColor: '#000000',
185
+ defaultFont: 'Microsoft YaHei',
186
+ defaultSize: 16,
187
+ minSize: 5,
188
+ maxSize: 72,
189
+ defaultRowMargin: 1,
190
+ defaultBasicRowMarginHeight: 8,
191
+ defaultTabWidth: 32,
192
+ width: 794,
193
+ height: 1123,
194
+ scale: 1,
195
+ pageGap: 20,
196
+ underlineColor: '#000000',
197
+ strikeoutColor: '#FF0000',
198
+ rangeAlpha: 0.6,
199
+ rangeColor: '#AECBFA',
200
+ rangeMinWidth: 5,
201
+ searchMatchAlpha: 0.6,
202
+ searchMatchColor: '#FFFF00',
203
+ searchNavigateMatchColor: '#AAD280',
204
+ highlightAlpha: 0.6,
205
+ highlightMarginHeight: 8,
206
+ resizerColor: '#4182D9',
207
+ resizerSize: 5,
208
+ marginIndicatorSize: 35,
209
+ marginIndicatorColor: '#BABABA',
210
+ margins: [100, 120, 100, 120],
211
+ pageMode: PageMode.PAGING,
212
+ renderMode: RenderMode.SPEED,
213
+ defaultHyperlinkColor: '#0000FF',
214
+ paperDirection: PaperDirection.VERTICAL,
215
+ inactiveAlpha: 0.6,
216
+ historyMaxRecordCount: 100,
217
+ wordBreak: WordBreak.BREAK_WORD,
218
+ printPixelRatio: 3,
219
+ maskMargin: [0, 0, 0, 0],
220
+ letterClass: [LETTER_CLASS.ENGLISH],
221
+ contextMenuDisableKeys: [],
222
+ shortcutDisableKeys: [],
223
+ scrollContainerSelector: '',
224
+ pageOuterSelectionDisable: false,
225
+ ...options,
226
+ table: tableOptions,
227
+ header: headerOptions,
228
+ footer: footerOptions,
229
+ pageNumber: pageNumberOptions,
230
+ watermark: waterMarkOptions,
231
+ control: controlOptions,
232
+ checkbox: checkboxOptions,
233
+ radio: radioOptions,
234
+ cursor: cursorOptions,
235
+ title: titleOptions,
236
+ placeholder: placeholderOptions,
237
+ group: groupOptions,
238
+ pageBreak: pageBreakOptions,
239
+ zone: zoneOptions,
240
+ background: backgroundOptions,
241
+ lineBreak: lineBreakOptions,
242
+ whiteSpace: whiteSpaceOptions,
243
+ separator: separatorOptions,
244
+ lineNumber: lineNumberOptions,
245
+ pageBorder: pageBorderOptions,
246
+ badge: badgeOptions,
247
+ modeRule: modeRuleOption,
248
+ graffiti: graffitiOptions,
249
+ label: labelOptions,
250
+ imgCaption: imgCaptionOptions,
251
+ list: listOptions
252
+ }
253
+ }