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,558 @@
1
+ import { ElementType, IElement, TableBorder } from '../../../..'
2
+ import { TdBorder, TdSlash } from '../../../../dataset/enum/table/Table'
3
+ import { DeepRequired } from '../../../../interface/Common'
4
+ import { IEditorOption } from '../../../../interface/Editor'
5
+ import { ITd } from '../../../../interface/table/Td'
6
+ import { ITr } from '../../../../interface/table/Tr'
7
+ import { deepClone } from '../../../../utils'
8
+ import { RangeManager } from '../../../range/RangeManager'
9
+ import { Draw } from '../../Draw'
10
+
11
+ interface IDrawTableBorderOption {
12
+ ctx: CanvasRenderingContext2D
13
+ startX: number
14
+ startY: number
15
+ width: number
16
+ height: number
17
+ borderExternalWidth?: number
18
+ isDrawFullBorder?: boolean
19
+ }
20
+
21
+ export class TableParticle {
22
+ private draw: Draw
23
+ private range: RangeManager
24
+ private options: DeepRequired<IEditorOption>
25
+
26
+ constructor(draw: Draw) {
27
+ this.draw = draw
28
+ this.range = draw.getRange()
29
+ this.options = draw.getOptions()
30
+ }
31
+
32
+ public getTrListGroupByCol(payload: ITr[]): ITr[] {
33
+ const trList = deepClone(payload)
34
+ for (let t = 0; t < payload.length; t++) {
35
+ const tr = trList[t]
36
+ for (let d = tr.tdList.length - 1; d >= 0; d--) {
37
+ const td = tr.tdList[d]
38
+ const { rowspan, rowIndex, colIndex } = td
39
+ const curRowIndex = rowIndex! + rowspan - 1
40
+ if (curRowIndex !== d) {
41
+ const changeTd = tr.tdList.splice(d, 1)[0]
42
+ trList[curRowIndex]?.tdList.splice(colIndex!, 0, changeTd)
43
+ }
44
+ }
45
+ }
46
+ return trList
47
+ }
48
+
49
+ public getRangeRowCol(): ITd[][] | null {
50
+ const { isTable, index, trIndex, tdIndex } = this.draw
51
+ .getPosition()
52
+ .getPositionContext()
53
+ if (!isTable) return null
54
+ const {
55
+ isCrossRowCol,
56
+ startTdIndex,
57
+ endTdIndex,
58
+ startTrIndex,
59
+ endTrIndex
60
+ } = this.range.getRange()
61
+ const originalElementList = this.draw.getOriginalElementList()
62
+ const element = originalElementList[index!]
63
+ const curTrList = element.trList!
64
+ // 非跨列直接返回光标所在单元格
65
+ if (!isCrossRowCol) {
66
+ return [[curTrList[trIndex!].tdList[tdIndex!]]]
67
+ }
68
+ let startTd = curTrList[startTrIndex!].tdList[startTdIndex!]
69
+ let endTd = curTrList[endTrIndex!].tdList[endTdIndex!]
70
+ // 交换起始位置
71
+ if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {
72
+ // prettier-ignore
73
+ [startTd, endTd] = [endTd, startTd]
74
+ }
75
+ const startColIndex = startTd.colIndex!
76
+ const endColIndex = endTd.colIndex! + (endTd.colspan - 1)
77
+ const startRowIndex = startTd.rowIndex!
78
+ const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)
79
+ // 选区行列
80
+ const rowCol: ITd[][] = []
81
+ for (let t = 0; t < curTrList.length; t++) {
82
+ const tr = curTrList[t]
83
+ const tdList: ITd[] = []
84
+ for (let d = 0; d < tr.tdList.length; d++) {
85
+ const td = tr.tdList[d]
86
+ const tdColIndex = td.colIndex!
87
+ const tdRowIndex = td.rowIndex!
88
+ if (
89
+ tdColIndex >= startColIndex &&
90
+ tdColIndex <= endColIndex &&
91
+ tdRowIndex >= startRowIndex &&
92
+ tdRowIndex <= endRowIndex
93
+ ) {
94
+ tdList.push(td)
95
+ }
96
+ }
97
+ if (tdList.length) {
98
+ rowCol.push(tdList)
99
+ }
100
+ }
101
+ return rowCol.length ? rowCol : null
102
+ }
103
+
104
+ private _drawOuterBorder(payload: IDrawTableBorderOption) {
105
+ const {
106
+ ctx,
107
+ startX,
108
+ startY,
109
+ width,
110
+ height,
111
+ isDrawFullBorder,
112
+ borderExternalWidth
113
+ } = payload
114
+ const { scale } = this.options
115
+ // 外部边框单独设置
116
+ const lineWidth = ctx.lineWidth
117
+ if (borderExternalWidth) {
118
+ ctx.lineWidth = borderExternalWidth * scale
119
+ }
120
+ ctx.beginPath()
121
+ const x = Math.round(startX)
122
+ const y = Math.round(startY)
123
+ ctx.translate(0.5, 0.5)
124
+ if (isDrawFullBorder) {
125
+ ctx.rect(x, y, width, height)
126
+ } else {
127
+ ctx.moveTo(x, y + height)
128
+ ctx.lineTo(x, y)
129
+ ctx.lineTo(x + width, y)
130
+ }
131
+ ctx.stroke()
132
+ // 还原边框设置
133
+ if (borderExternalWidth) {
134
+ ctx.lineWidth = lineWidth
135
+ }
136
+ ctx.translate(-0.5, -0.5)
137
+ }
138
+
139
+ private _drawSlash(
140
+ ctx: CanvasRenderingContext2D,
141
+ td: ITd,
142
+ startX: number,
143
+ startY: number
144
+ ) {
145
+ const { scale } = this.options
146
+ ctx.save()
147
+ const width = td.width! * scale
148
+ const height = td.height! * scale
149
+ const x = Math.round(td.x! * scale + startX)
150
+ const y = Math.round(td.y! * scale + startY)
151
+ // 正斜线 /
152
+ if (td.slashTypes?.includes(TdSlash.FORWARD)) {
153
+ ctx.moveTo(x + width, y)
154
+ ctx.lineTo(x, y + height)
155
+ }
156
+ // 反斜线 \
157
+ if (td.slashTypes?.includes(TdSlash.BACK)) {
158
+ ctx.moveTo(x, y)
159
+ ctx.lineTo(x + width, y + height)
160
+ }
161
+ ctx.stroke()
162
+ ctx.restore()
163
+ }
164
+
165
+ private _drawBorder(
166
+ ctx: CanvasRenderingContext2D,
167
+ element: IElement,
168
+ startX: number,
169
+ startY: number
170
+ ) {
171
+ const {
172
+ colgroup,
173
+ trList,
174
+ borderType,
175
+ borderColor,
176
+ borderWidth = 1,
177
+ borderExternalWidth
178
+ } = element
179
+ if (!colgroup || !trList) return
180
+ const {
181
+ scale,
182
+ table: { defaultBorderColor }
183
+ } = this.options
184
+ const tableWidth = element.width! * scale
185
+ const tableHeight = element.height! * scale
186
+ // 无边框
187
+ const isEmptyBorderType = borderType === TableBorder.EMPTY
188
+ // 仅外边框
189
+ const isExternalBorderType = borderType === TableBorder.EXTERNAL
190
+ // 内边框
191
+ const isInternalBorderType = borderType === TableBorder.INTERNAL
192
+ ctx.save()
193
+ // 虚线
194
+ if (borderType === TableBorder.DASH) {
195
+ ctx.setLineDash([3, 3])
196
+ }
197
+ ctx.lineWidth = borderWidth * scale
198
+ ctx.strokeStyle = borderColor || defaultBorderColor
199
+ // 渲染边框
200
+ if (!isEmptyBorderType && !isInternalBorderType) {
201
+ this._drawOuterBorder({
202
+ ctx,
203
+ startX,
204
+ startY,
205
+ width: tableWidth,
206
+ height: tableHeight,
207
+ borderExternalWidth,
208
+ isDrawFullBorder: isExternalBorderType
209
+ })
210
+ }
211
+ // 渲染单元格
212
+ for (let t = 0; t < trList.length; t++) {
213
+ const tr = trList[t]
214
+ for (let d = 0; d < tr.tdList.length; d++) {
215
+ const td = tr.tdList[d]
216
+ // 单元格内斜线
217
+ if (td.slashTypes?.length) {
218
+ this._drawSlash(ctx, td, startX, startY)
219
+ }
220
+ // 没有设置单元格边框 && 没有设置表格边框则忽略
221
+ if (
222
+ !td.borderTypes?.length &&
223
+ (isEmptyBorderType || isExternalBorderType)
224
+ ) {
225
+ continue
226
+ }
227
+ const width = td.width! * scale
228
+ const height = td.height! * scale
229
+ const x = Math.round(td.x! * scale + startX + width)
230
+ const y = Math.round(td.y! * scale + startY)
231
+ ctx.translate(0.5, 0.5)
232
+ // 绘制线条
233
+ ctx.beginPath()
234
+ // 单元格边框
235
+ if (td.borderTypes?.includes(TdBorder.TOP)) {
236
+ ctx.moveTo(x - width, y)
237
+ ctx.lineTo(x, y)
238
+ ctx.stroke()
239
+ }
240
+ if (td.borderTypes?.includes(TdBorder.RIGHT)) {
241
+ ctx.moveTo(x, y)
242
+ ctx.lineTo(x, y + height)
243
+ ctx.stroke()
244
+ }
245
+ if (td.borderTypes?.includes(TdBorder.BOTTOM)) {
246
+ ctx.moveTo(x, y + height)
247
+ ctx.lineTo(x - width, y + height)
248
+ ctx.stroke()
249
+ }
250
+ if (td.borderTypes?.includes(TdBorder.LEFT)) {
251
+ ctx.moveTo(x - width, y)
252
+ ctx.lineTo(x - width, y + height)
253
+ ctx.stroke()
254
+ }
255
+ // 表格线
256
+ if (!isEmptyBorderType && !isExternalBorderType) {
257
+ // 右边框
258
+ if (
259
+ !isInternalBorderType ||
260
+ td.colIndex! + td.colspan < colgroup.length
261
+ ) {
262
+ ctx.moveTo(x, y)
263
+ ctx.lineTo(x, y + height)
264
+ // 外部边框宽度设置时 => 最右边框宽度单独设置
265
+ if (
266
+ borderExternalWidth &&
267
+ borderExternalWidth !== borderWidth &&
268
+ td.colIndex! + td.colspan === colgroup.length
269
+ ) {
270
+ const lineWidth = ctx.lineWidth
271
+ ctx.lineWidth = borderExternalWidth * scale
272
+ ctx.stroke()
273
+ // 清空path
274
+ ctx.beginPath()
275
+ ctx.lineWidth = lineWidth
276
+ }
277
+ }
278
+ // 下边框
279
+ if (
280
+ !isInternalBorderType ||
281
+ td.rowIndex! + td.rowspan < trList.length
282
+ ) {
283
+ // 外部边框宽度设置时 => 立即绘制竖线
284
+ const isSetExternalBottomBorder =
285
+ borderExternalWidth &&
286
+ borderExternalWidth !== borderWidth &&
287
+ td.rowIndex! + td.rowspan === trList.length
288
+ if (isSetExternalBottomBorder) {
289
+ ctx.stroke()
290
+ // 清空path
291
+ ctx.beginPath()
292
+ }
293
+ ctx.moveTo(x, y + height)
294
+ ctx.lineTo(x - width, y + height)
295
+ // 外部边框宽度设置时 => 最下边框宽度单独设置
296
+ if (isSetExternalBottomBorder) {
297
+ const lineWidth = ctx.lineWidth
298
+ ctx.lineWidth = borderExternalWidth * scale
299
+ ctx.stroke()
300
+ // 清空path
301
+ ctx.beginPath()
302
+ ctx.lineWidth = lineWidth
303
+ }
304
+ }
305
+ ctx.stroke()
306
+ }
307
+ ctx.translate(-0.5, -0.5)
308
+ }
309
+ }
310
+ ctx.restore()
311
+ }
312
+
313
+ private _drawBackgroundColor(
314
+ ctx: CanvasRenderingContext2D,
315
+ element: IElement,
316
+ startX: number,
317
+ startY: number
318
+ ) {
319
+ const { trList } = element
320
+ if (!trList) return
321
+ const { scale } = this.options
322
+ for (let t = 0; t < trList.length; t++) {
323
+ const tr = trList[t]
324
+ for (let d = 0; d < tr.tdList.length; d++) {
325
+ const td = tr.tdList[d]
326
+ if (!td.backgroundColor) continue
327
+ ctx.save()
328
+ const width = td.width! * scale
329
+ const height = td.height! * scale
330
+ const x = Math.round(td.x! * scale + startX)
331
+ const y = Math.round(td.y! * scale + startY)
332
+ ctx.fillStyle = td.backgroundColor
333
+ ctx.fillRect(x, y, width, height)
334
+ ctx.restore()
335
+ }
336
+ }
337
+ }
338
+
339
+ public getTableWidth(element: IElement): number {
340
+ return element.colgroup!.reduce((pre, cur) => pre + cur.width, 0)
341
+ }
342
+
343
+ public getTableHeight(element: IElement): number {
344
+ const trList = element.trList
345
+ if (!trList?.length) return 0
346
+ return this.getTdListByColIndex(trList, 0).reduce(
347
+ (pre, cur) => pre + cur.height!,
348
+ 0
349
+ )
350
+ }
351
+
352
+ public getRowCountByColIndex(trList: ITr[], colIndex: number): number {
353
+ return this.getTdListByColIndex(trList, colIndex).reduce(
354
+ (pre, cur) => pre + cur.rowspan,
355
+ 0
356
+ )
357
+ }
358
+
359
+ public getTdListByColIndex(trList: ITr[], colIndex: number): ITd[] {
360
+ const data: ITd[] = []
361
+ for (let r = 0; r < trList.length; r++) {
362
+ const tdList = trList[r].tdList
363
+ for (let d = 0; d < tdList.length; d++) {
364
+ const td = tdList[d]
365
+ const min = td.colIndex!
366
+ const max = min + td.colspan - 1
367
+ if (colIndex >= min && colIndex <= max) {
368
+ data.push(td)
369
+ }
370
+ }
371
+ }
372
+ return data
373
+ }
374
+
375
+ public getTdListByRowIndex(trList: ITr[], rowIndex: number) {
376
+ const data: ITd[] = []
377
+ for (let r = 0; r < trList.length; r++) {
378
+ const tdList = trList[r].tdList
379
+ for (let d = 0; d < tdList.length; d++) {
380
+ const td = tdList[d]
381
+ const min = td.rowIndex!
382
+ const max = min + td.rowspan - 1
383
+ if (rowIndex >= min && rowIndex <= max) {
384
+ data.push(td)
385
+ }
386
+ }
387
+ }
388
+ return data
389
+ }
390
+
391
+ public computeRowColInfo(element: IElement) {
392
+ const { colgroup, trList } = element
393
+ if (!colgroup || !trList) return
394
+ let preX = 0
395
+ for (let t = 0; t < trList.length; t++) {
396
+ const tr = trList[t]
397
+ // 表格最后一行
398
+ const isLastTr = trList.length - 1 === t
399
+ // 当前行最小高度
400
+ let rowMinHeight = 0
401
+ for (let d = 0; d < tr.tdList.length; d++) {
402
+ const td = tr.tdList[d]
403
+ // 计算当前td所属列索引
404
+ let colIndex = 0
405
+ // 第一行td位置为当前列索引+上一个单元格colspan,否则从第一行开始计算列偏移量
406
+ if (trList.length > 1 && t !== 0) {
407
+ // 当前列起始索引:以之前单元格为起始点
408
+ const preTd = tr.tdList[d - 1]
409
+ const start = preTd ? preTd.colIndex! + preTd.colspan : d
410
+ for (let c = start; c < colgroup.length; c++) {
411
+ // 查找相同索引列之前行数,相加判断是否位置被挤占
412
+ const rowCount = this.getRowCountByColIndex(trList.slice(0, t), c)
413
+ // 不存在挤占则默认当前单元格可以存在该位置
414
+ if (rowCount === t) {
415
+ colIndex = c
416
+ // 重置单元格起始位置坐标
417
+ let preColWidth = 0
418
+ for (let preC = 0; preC < c; preC++) {
419
+ preColWidth += colgroup[preC].width
420
+ }
421
+ preX = preColWidth
422
+ break
423
+ }
424
+ }
425
+ } else {
426
+ const preTd = tr.tdList[d - 1]
427
+ if (preTd) {
428
+ colIndex = preTd.colIndex! + preTd.colspan
429
+ }
430
+ }
431
+ // 计算格宽高
432
+ let width = 0
433
+ for (let col = 0; col < td.colspan; col++) {
434
+ width += colgroup[col + colIndex].width
435
+ }
436
+ let height = 0
437
+ for (let row = 0; row < td.rowspan; row++) {
438
+ const curTr = trList[row + t] || trList[t]
439
+ height += curTr.height
440
+ }
441
+ // y偏移量
442
+ if (rowMinHeight === 0 || rowMinHeight > height) {
443
+ rowMinHeight = height
444
+ }
445
+ // 当前行最后一个td
446
+ const isLastRowTd = tr.tdList.length - 1 === d
447
+ // 当前列最后一个td
448
+ let isLastColTd = isLastTr
449
+ if (!isLastColTd) {
450
+ if (td.rowspan > 1) {
451
+ const nextTrLength = trList.length - 1 - t
452
+ isLastColTd = td.rowspan - 1 === nextTrLength
453
+ }
454
+ }
455
+ // 当前表格最后一个td
456
+ const isLastTd = isLastTr && isLastRowTd
457
+ td.isLastRowTd = isLastRowTd
458
+ td.isLastColTd = isLastColTd
459
+ td.isLastTd = isLastTd
460
+ // 修改当前格clientBox
461
+ td.x = preX
462
+ // 之前行相同列的高度
463
+ let preY = 0
464
+ for (let preR = 0; preR < t; preR++) {
465
+ const preTdList = trList[preR].tdList
466
+ for (let preD = 0; preD < preTdList.length; preD++) {
467
+ const td = preTdList[preD]
468
+ if (
469
+ colIndex >= td.colIndex! &&
470
+ colIndex < td.colIndex! + td.colspan
471
+ ) {
472
+ preY += td.height!
473
+ break
474
+ }
475
+ }
476
+ }
477
+ td.y = preY
478
+ td.width = width
479
+ td.height = height
480
+ td.rowIndex = t
481
+ td.colIndex = colIndex
482
+ td.trIndex = t
483
+ td.tdIndex = d
484
+ // 当前列x轴累加
485
+ preX += width
486
+ // 一行中的最后td
487
+ if (isLastRowTd && !isLastTd) {
488
+ preX = 0
489
+ }
490
+ }
491
+ }
492
+ }
493
+
494
+ public drawRange(
495
+ ctx: CanvasRenderingContext2D,
496
+ element: IElement,
497
+ startX: number,
498
+ startY: number
499
+ ) {
500
+ const { scale, rangeAlpha, rangeColor } = this.options
501
+ const { type, trList } = element
502
+ if (!trList || type !== ElementType.TABLE) return
503
+ const {
504
+ isCrossRowCol,
505
+ startTdIndex,
506
+ endTdIndex,
507
+ startTrIndex,
508
+ endTrIndex
509
+ } = this.range.getRange()
510
+ // 存在跨行/列
511
+ if (!isCrossRowCol) return
512
+ let startTd = trList[startTrIndex!].tdList[startTdIndex!]
513
+ let endTd = trList[endTrIndex!].tdList[endTdIndex!]
514
+ // 交换起始位置
515
+ if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {
516
+ // prettier-ignore
517
+ [startTd, endTd] = [endTd, startTd]
518
+ }
519
+ const startColIndex = startTd.colIndex!
520
+ const endColIndex = endTd.colIndex! + (endTd.colspan - 1)
521
+ const startRowIndex = startTd.rowIndex!
522
+ const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)
523
+ ctx.save()
524
+ for (let t = 0; t < trList.length; t++) {
525
+ const tr = trList[t]
526
+ for (let d = 0; d < tr.tdList.length; d++) {
527
+ const td = tr.tdList[d]
528
+ const tdColIndex = td.colIndex!
529
+ const tdRowIndex = td.rowIndex!
530
+ if (
531
+ tdColIndex >= startColIndex &&
532
+ tdColIndex <= endColIndex &&
533
+ tdRowIndex >= startRowIndex &&
534
+ tdRowIndex <= endRowIndex
535
+ ) {
536
+ const x = td.x! * scale
537
+ const y = td.y! * scale
538
+ const width = td.width! * scale
539
+ const height = td.height! * scale
540
+ ctx.globalAlpha = rangeAlpha
541
+ ctx.fillStyle = rangeColor
542
+ ctx.fillRect(x + startX, y + startY, width, height)
543
+ }
544
+ }
545
+ }
546
+ ctx.restore()
547
+ }
548
+
549
+ public render(
550
+ ctx: CanvasRenderingContext2D,
551
+ element: IElement,
552
+ startX: number,
553
+ startY: number
554
+ ) {
555
+ this._drawBackgroundColor(ctx, element, startX, startY)
556
+ this._drawBorder(ctx, element, startX, startY)
557
+ }
558
+ }