@hailin-zheng/editor-core 1.0.10 → 1.0.14

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 (300) hide show
  1. package/lib/doc-ruler.d.ts +51 -0
  2. package/lib/doc-ruler.js +313 -0
  3. package/lib/doc-ruler.js.map +1 -0
  4. package/lib/framework/common-util.d.ts +63 -0
  5. package/lib/framework/common-util.js +178 -0
  6. package/lib/framework/common-util.js.map +1 -0
  7. package/lib/framework/document-change.d.ts +265 -0
  8. package/lib/framework/document-change.js +1342 -0
  9. package/lib/framework/document-change.js.map +1 -0
  10. package/lib/framework/document-combine.d.ts +24 -0
  11. package/lib/framework/document-combine.js +40 -0
  12. package/lib/framework/document-combine.js.map +1 -0
  13. package/lib/framework/document-comment.d.ts +46 -0
  14. package/lib/framework/document-comment.js +148 -0
  15. package/lib/framework/document-comment.js.map +1 -0
  16. package/lib/framework/document-context.d.ts +149 -0
  17. package/lib/framework/document-context.js +330 -0
  18. package/lib/framework/document-context.js.map +1 -0
  19. package/lib/framework/document-eval-func.d.ts +18 -0
  20. package/lib/framework/document-eval-func.js +48 -0
  21. package/lib/framework/document-eval-func.js.map +1 -0
  22. package/lib/framework/document-event.d.ts +213 -0
  23. package/lib/framework/document-event.js +1054 -0
  24. package/lib/framework/document-event.js.map +1 -0
  25. package/lib/framework/document-history.d.ts +26 -0
  26. package/lib/framework/document-history.js +65 -0
  27. package/lib/framework/document-history.js.map +1 -0
  28. package/lib/framework/document-images-loader.d.ts +16 -0
  29. package/lib/framework/document-images-loader.js +66 -0
  30. package/lib/framework/document-images-loader.js.map +1 -0
  31. package/lib/framework/document-input-cursor.d.ts +78 -0
  32. package/lib/framework/document-input-cursor.js +239 -0
  33. package/lib/framework/document-input-cursor.js.map +1 -0
  34. package/lib/framework/document-paint.d.ts +34 -0
  35. package/lib/framework/document-paint.js +103 -0
  36. package/lib/framework/document-paint.js.map +1 -0
  37. package/lib/framework/document-print-offscreen.d.ts +38 -0
  38. package/lib/framework/document-print-offscreen.js +128 -0
  39. package/lib/framework/document-print-offscreen.js.map +1 -0
  40. package/lib/framework/document-print.d.ts +60 -0
  41. package/lib/framework/document-print.js +203 -0
  42. package/lib/framework/document-print.js.map +1 -0
  43. package/lib/framework/document-segmenter.d.ts +2 -0
  44. package/lib/framework/document-segmenter.js +106 -0
  45. package/lib/framework/document-segmenter.js.map +1 -0
  46. package/lib/framework/document-selection.d.ts +89 -0
  47. package/lib/framework/document-selection.js +358 -0
  48. package/lib/framework/document-selection.js.map +1 -0
  49. package/lib/framework/document-template.d.ts +4 -0
  50. package/lib/framework/document-template.js +20 -0
  51. package/lib/framework/document-template.js.map +1 -0
  52. package/lib/framework/document-textline-mode.d.ts +7 -0
  53. package/lib/framework/document-textline-mode.js +30 -0
  54. package/lib/framework/document-textline-mode.js.map +1 -0
  55. package/lib/framework/element-define.d.ts +319 -0
  56. package/lib/framework/element-define.js +579 -0
  57. package/lib/framework/element-define.js.map +1 -0
  58. package/lib/framework/element-event-define.d.ts +98 -0
  59. package/lib/framework/element-event-define.js +108 -0
  60. package/lib/framework/element-event-define.js.map +1 -0
  61. package/lib/framework/element-measure.d.ts +97 -0
  62. package/lib/framework/element-measure.js +551 -0
  63. package/lib/framework/element-measure.js.map +1 -0
  64. package/lib/framework/element-paint.d.ts +42 -0
  65. package/lib/framework/element-paint.js +170 -0
  66. package/lib/framework/element-paint.js.map +1 -0
  67. package/lib/framework/element-props.d.ts +301 -0
  68. package/lib/framework/element-props.js +809 -0
  69. package/lib/framework/element-props.js.map +1 -0
  70. package/lib/framework/element-reader.d.ts +19 -0
  71. package/lib/framework/element-reader.js +151 -0
  72. package/lib/framework/element-reader.js.map +1 -0
  73. package/lib/framework/element-render-cut.d.ts +55 -0
  74. package/lib/framework/element-render-cut.js +449 -0
  75. package/lib/framework/element-render-cut.js.map +1 -0
  76. package/lib/framework/element-serialize.d.ts +30 -0
  77. package/lib/framework/element-serialize.js +113 -0
  78. package/lib/framework/element-serialize.js.map +1 -0
  79. package/lib/framework/element-util.d.ts +369 -0
  80. package/lib/framework/element-util.js +1463 -0
  81. package/lib/framework/element-util.js.map +1 -0
  82. package/lib/framework/impl/checkbox/checkbox-impl.d.ts +24 -0
  83. package/lib/framework/impl/checkbox/checkbox-impl.js +64 -0
  84. package/lib/framework/impl/checkbox/checkbox-impl.js.map +1 -0
  85. package/lib/framework/impl/comments/comment-content-impl.d.ts +40 -0
  86. package/lib/framework/impl/comments/comment-content-impl.js +105 -0
  87. package/lib/framework/impl/comments/comment-content-impl.js.map +1 -0
  88. package/lib/framework/impl/comments/comment-element-impl.d.ts +21 -0
  89. package/lib/framework/impl/comments/comment-element-impl.js +62 -0
  90. package/lib/framework/impl/comments/comment-element-impl.js.map +1 -0
  91. package/lib/framework/impl/comments/comments-container-impl.d.ts +22 -0
  92. package/lib/framework/impl/comments/comments-container-impl.js +62 -0
  93. package/lib/framework/impl/comments/comments-container-impl.js.map +1 -0
  94. package/lib/framework/impl/comments/comments-util.d.ts +12 -0
  95. package/lib/framework/impl/comments/comments-util.js +67 -0
  96. package/lib/framework/impl/comments/comments-util.js.map +1 -0
  97. package/lib/framework/impl/comments/validate-msg-impl.d.ts +21 -0
  98. package/lib/framework/impl/comments/validate-msg-impl.js +83 -0
  99. package/lib/framework/impl/comments/validate-msg-impl.js.map +1 -0
  100. package/lib/framework/impl/data-element/data-decorate-impl.d.ts +30 -0
  101. package/lib/framework/impl/data-element/data-decorate-impl.js +91 -0
  102. package/lib/framework/impl/data-element/data-decorate-impl.js.map +1 -0
  103. package/lib/framework/impl/data-element/data-element-barcode.d.ts +31 -0
  104. package/lib/framework/impl/data-element/data-element-barcode.js +115 -0
  105. package/lib/framework/impl/data-element/data-element-barcode.js.map +1 -0
  106. package/lib/framework/impl/data-element/data-element-base-impl.d.ts +68 -0
  107. package/lib/framework/impl/data-element/data-element-base-impl.js +205 -0
  108. package/lib/framework/impl/data-element/data-element-base-impl.js.map +1 -0
  109. package/lib/framework/impl/data-element/data-element-check-impl.d.ts +35 -0
  110. package/lib/framework/impl/data-element/data-element-check-impl.js +133 -0
  111. package/lib/framework/impl/data-element/data-element-check-impl.js.map +1 -0
  112. package/lib/framework/impl/data-element/data-element-date-impl.d.ts +23 -0
  113. package/lib/framework/impl/data-element/data-element-date-impl.js +111 -0
  114. package/lib/framework/impl/data-element/data-element-date-impl.js.map +1 -0
  115. package/lib/framework/impl/data-element/data-element-group-impl.d.ts +23 -0
  116. package/lib/framework/impl/data-element/data-element-group-impl.js +130 -0
  117. package/lib/framework/impl/data-element/data-element-group-impl.js.map +1 -0
  118. package/lib/framework/impl/data-element/data-element-image-impl.d.ts +30 -0
  119. package/lib/framework/impl/data-element/data-element-image-impl.js +137 -0
  120. package/lib/framework/impl/data-element/data-element-image-impl.js.map +1 -0
  121. package/lib/framework/impl/data-element/data-element-list-impl.d.ts +22 -0
  122. package/lib/framework/impl/data-element/data-element-list-impl.js +131 -0
  123. package/lib/framework/impl/data-element/data-element-list-impl.js.map +1 -0
  124. package/lib/framework/impl/data-element/data-element-text-impl.d.ts +23 -0
  125. package/lib/framework/impl/data-element/data-element-text-impl.js +103 -0
  126. package/lib/framework/impl/data-element/data-element-text-impl.js.map +1 -0
  127. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts +21 -0
  128. package/lib/framework/impl/decorate/fill-null-space-imple.js +43 -0
  129. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +1 -0
  130. package/lib/framework/impl/document/doc-body-impl.d.ts +27 -0
  131. package/lib/framework/impl/document/doc-body-impl.js +79 -0
  132. package/lib/framework/impl/document/doc-body-impl.js.map +1 -0
  133. package/lib/framework/impl/document/doc-body-part-impl.d.ts +30 -0
  134. package/lib/framework/impl/document/doc-body-part-impl.js +94 -0
  135. package/lib/framework/impl/document/doc-body-part-impl.js.map +1 -0
  136. package/lib/framework/impl/document/doc-container-impl.d.ts +16 -0
  137. package/lib/framework/impl/document/doc-container-impl.js +21 -0
  138. package/lib/framework/impl/document/doc-container-impl.js.map +1 -0
  139. package/lib/framework/impl/document/doc-footer-impl.d.ts +26 -0
  140. package/lib/framework/impl/document/doc-footer-impl.js +77 -0
  141. package/lib/framework/impl/document/doc-footer-impl.js.map +1 -0
  142. package/lib/framework/impl/document/doc-header-impl.d.ts +26 -0
  143. package/lib/framework/impl/document/doc-header-impl.js +83 -0
  144. package/lib/framework/impl/document/doc-header-impl.js.map +1 -0
  145. package/lib/framework/impl/document/doc-impl.d.ts +61 -0
  146. package/lib/framework/impl/document/doc-impl.js +209 -0
  147. package/lib/framework/impl/document/doc-impl.js.map +1 -0
  148. package/lib/framework/impl/media-formula/menstrual-history.d.ts +35 -0
  149. package/lib/framework/impl/media-formula/menstrual-history.js +153 -0
  150. package/lib/framework/impl/media-formula/menstrual-history.js.map +1 -0
  151. package/lib/framework/impl/paragraph/p-impl.d.ts +45 -0
  152. package/lib/framework/impl/paragraph/p-impl.js +156 -0
  153. package/lib/framework/impl/paragraph/p-impl.js.map +1 -0
  154. package/lib/framework/impl/picture/image-impl.d.ts +31 -0
  155. package/lib/framework/impl/picture/image-impl.js +124 -0
  156. package/lib/framework/impl/picture/image-impl.js.map +1 -0
  157. package/lib/framework/impl/radio/radio-impl.d.ts +22 -0
  158. package/lib/framework/impl/radio/radio-impl.js +72 -0
  159. package/lib/framework/impl/radio/radio-impl.js.map +1 -0
  160. package/lib/framework/impl/symbol/br-symbol-impl.d.ts +22 -0
  161. package/lib/framework/impl/symbol/br-symbol-impl.js +54 -0
  162. package/lib/framework/impl/symbol/br-symbol-impl.js.map +1 -0
  163. package/lib/framework/impl/symbol/p-symbol-impl.d.ts +19 -0
  164. package/lib/framework/impl/symbol/p-symbol-impl.js +54 -0
  165. package/lib/framework/impl/symbol/p-symbol-impl.js.map +1 -0
  166. package/lib/framework/impl/table/table-cell-impl.d.ts +37 -0
  167. package/lib/framework/impl/table/table-cell-impl.js +145 -0
  168. package/lib/framework/impl/table/table-cell-impl.js.map +1 -0
  169. package/lib/framework/impl/table/table-impl.d.ts +55 -0
  170. package/lib/framework/impl/table/table-impl.js +363 -0
  171. package/lib/framework/impl/table/table-impl.js.map +1 -0
  172. package/lib/framework/impl/table/table-row-impl.d.ts +26 -0
  173. package/lib/framework/impl/table/table-row-impl.js +75 -0
  174. package/lib/framework/impl/table/table-row-impl.js.map +1 -0
  175. package/lib/framework/impl/table/table-split-cell-patch.d.ts +20 -0
  176. package/lib/framework/impl/table/table-split-cell-patch.js +89 -0
  177. package/lib/framework/impl/table/table-split-cell-patch.js.map +1 -0
  178. package/lib/framework/impl/table/table-split-cell.d.ts +90 -0
  179. package/lib/framework/impl/table/table-split-cell.js +464 -0
  180. package/lib/framework/impl/table/table-split-cell.js.map +1 -0
  181. package/lib/framework/impl/table/table-util.d.ts +150 -0
  182. package/lib/framework/impl/table/table-util.js +678 -0
  183. package/lib/framework/impl/table/table-util.js.map +1 -0
  184. package/lib/framework/impl/text/text-impl.d.ts +32 -0
  185. package/lib/framework/impl/text/text-impl.js +149 -0
  186. package/lib/framework/impl/text/text-impl.js.map +1 -0
  187. package/lib/framework/impl/text/track-run-impl.d.ts +27 -0
  188. package/lib/framework/impl/text/track-run-impl.js +112 -0
  189. package/lib/framework/impl/text/track-run-impl.js.map +1 -0
  190. package/lib/framework/notify.d.ts +13 -0
  191. package/lib/framework/notify.js +116 -0
  192. package/lib/framework/notify.js.map +1 -0
  193. package/lib/framework/range-util.d.ts +40 -0
  194. package/lib/framework/range-util.js +312 -0
  195. package/lib/framework/range-util.js.map +1 -0
  196. package/lib/framework/render-context.d.ts +91 -0
  197. package/lib/framework/render-context.js +384 -0
  198. package/lib/framework/render-context.js.map +1 -0
  199. package/lib/framework/render-define.d.ts +109 -0
  200. package/lib/framework/render-define.js +195 -0
  201. package/lib/framework/render-define.js.map +1 -0
  202. package/lib/framework/selection-overlays.d.ts +30 -0
  203. package/lib/framework/selection-overlays.js +124 -0
  204. package/lib/framework/selection-overlays.js.map +1 -0
  205. package/lib/texteditor.d.ts +318 -0
  206. package/lib/texteditor.js +913 -0
  207. package/lib/texteditor.js.map +1 -0
  208. package/lib/util/subject.d.ts +34 -0
  209. package/lib/util/subject.js +88 -0
  210. package/lib/util/subject.js.map +1 -0
  211. package/{src/med_editor/util/table-bind.ts → lib/util/table-bind.d.ts} +2 -3
  212. package/lib/util/table-bind.js +6 -0
  213. package/lib/util/table-bind.js.map +1 -0
  214. package/package.json +2 -2
  215. package/src/med_editor/doc-ruler.ts +0 -340
  216. package/src/med_editor/framework/common-util.ts +0 -200
  217. package/src/med_editor/framework/document-change.ts +0 -1391
  218. package/src/med_editor/framework/document-combine.ts +0 -44
  219. package/src/med_editor/framework/document-comment.ts +0 -163
  220. package/src/med_editor/framework/document-context.ts +0 -410
  221. package/src/med_editor/framework/document-eval-func.ts +0 -53
  222. package/src/med_editor/framework/document-event.ts +0 -1082
  223. package/src/med_editor/framework/document-history.ts +0 -76
  224. package/src/med_editor/framework/document-images-loader.ts +0 -74
  225. package/src/med_editor/framework/document-input-cursor.ts +0 -244
  226. package/src/med_editor/framework/document-paint.ts +0 -110
  227. package/src/med_editor/framework/document-print-offscreen.ts +0 -134
  228. package/src/med_editor/framework/document-print.ts +0 -219
  229. package/src/med_editor/framework/document-segmenter.ts +0 -211
  230. package/src/med_editor/framework/document-selection.ts +0 -389
  231. package/src/med_editor/framework/document-template.ts +0 -20
  232. package/src/med_editor/framework/document-textline-mode.ts +0 -34
  233. package/src/med_editor/framework/element-define.ts +0 -674
  234. package/src/med_editor/framework/element-event-define.ts +0 -141
  235. package/src/med_editor/framework/element-measure.ts +0 -573
  236. package/src/med_editor/framework/element-paint.ts +0 -176
  237. package/src/med_editor/framework/element-props.ts +0 -938
  238. package/src/med_editor/framework/element-reader.ts +0 -159
  239. package/src/med_editor/framework/element-render-cut.ts +0 -456
  240. package/src/med_editor/framework/element-serialize.ts +0 -126
  241. package/src/med_editor/framework/element-util.ts +0 -1564
  242. package/src/med_editor/framework/impl/checkbox/checkbox-impl.ts +0 -71
  243. package/src/med_editor/framework/impl/comments/comment-content-impl.ts +0 -119
  244. package/src/med_editor/framework/impl/comments/comment-element-impl.ts +0 -65
  245. package/src/med_editor/framework/impl/comments/comments-container-impl.ts +0 -68
  246. package/src/med_editor/framework/impl/comments/comments-util.ts +0 -84
  247. package/src/med_editor/framework/impl/comments/validate-msg-impl.ts +0 -94
  248. package/src/med_editor/framework/impl/data-element/data-decorate-impl.ts +0 -95
  249. package/src/med_editor/framework/impl/data-element/data-element-barcode.ts +0 -127
  250. package/src/med_editor/framework/impl/data-element/data-element-base-impl.ts +0 -234
  251. package/src/med_editor/framework/impl/data-element/data-element-check-impl.ts +0 -146
  252. package/src/med_editor/framework/impl/data-element/data-element-date-impl.ts +0 -128
  253. package/src/med_editor/framework/impl/data-element/data-element-group-impl.ts +0 -150
  254. package/src/med_editor/framework/impl/data-element/data-element-image-impl.ts +0 -147
  255. package/src/med_editor/framework/impl/data-element/data-element-list-impl.ts +0 -142
  256. package/src/med_editor/framework/impl/data-element/data-element-text-impl.ts +0 -117
  257. package/src/med_editor/framework/impl/decorate/fill-null-space-imple.ts +0 -48
  258. package/src/med_editor/framework/impl/document/doc-body-impl.ts +0 -95
  259. package/src/med_editor/framework/impl/document/doc-body-part-impl.ts +0 -104
  260. package/src/med_editor/framework/impl/document/doc-container-impl.ts +0 -24
  261. package/src/med_editor/framework/impl/document/doc-footer-impl.ts +0 -88
  262. package/src/med_editor/framework/impl/document/doc-header-impl.ts +0 -100
  263. package/src/med_editor/framework/impl/document/doc-impl.ts +0 -226
  264. package/src/med_editor/framework/impl/media-formula/menstrual-history.ts +0 -175
  265. package/src/med_editor/framework/impl/paragraph/p-impl.ts +0 -190
  266. package/src/med_editor/framework/impl/picture/image-impl.ts +0 -136
  267. package/src/med_editor/framework/impl/radio/radio-impl.ts +0 -79
  268. package/src/med_editor/framework/impl/symbol/br-symbol-impl.ts +0 -60
  269. package/src/med_editor/framework/impl/symbol/p-symbol-impl.ts +0 -57
  270. package/src/med_editor/framework/impl/table/table-cell-impl.ts +0 -156
  271. package/src/med_editor/framework/impl/table/table-impl.ts +0 -401
  272. package/src/med_editor/framework/impl/table/table-row-impl.ts +0 -83
  273. package/src/med_editor/framework/impl/table/table-split-cell-patch.ts +0 -98
  274. package/src/med_editor/framework/impl/table/table-split-cell.ts +0 -475
  275. package/src/med_editor/framework/impl/table/table-util.ts +0 -716
  276. package/src/med_editor/framework/impl/text/text-impl.ts +0 -163
  277. package/src/med_editor/framework/impl/text/track-run-impl.ts +0 -135
  278. package/src/med_editor/framework/notify.ts +0 -130
  279. package/src/med_editor/framework/range-util.ts +0 -321
  280. package/src/med_editor/framework/render-context.ts +0 -431
  281. package/src/med_editor/framework/render-define.ts +0 -224
  282. package/src/med_editor/framework/selection-overlays.ts +0 -133
  283. package/src/med_editor/texteditor.ts +0 -1010
  284. package/src/med_editor/util/subject.ts +0 -118
  285. package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225.json +0 -3573
  286. package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225.json +0 -3573
  287. package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225bug.json +0 -315
  288. package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225/346/211/271/346/263/250.json +0 -122
  289. package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225/346/226/207/346/241/243/351/252/214/350/257/201.json +0 -3599
  290. package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225/351/225/277/346/226/207/346/234/254.json +0 -24586
  291. package/src/med_editor//345/220/210/345/271/266/347/227/205/347/250/213/345/275/225.json +0 -2874
  292. package/src/med_editor//346/211/213/346/234/257/350/256/260/345/275/225.json +0 -341
  293. package/src/med_editor//346/231/256/351/200/232doc/347/261/273/346/226/207/346/241/243.json +0 -2201
  294. package/src/med_editor//346/243/200/351/252/214/347/224/263/350/257/267/345/215/225.json +0 -1069
  295. package/src/med_editor//347/227/205/347/250/213/345/275/225//345/206/205/351/225/234/344/270/213/346/262/273/347/226/227/350/256/260/345/275/225.json +0 -125
  296. package/src/med_editor//347/227/205/347/250/213/345/275/225//345/220/210/345/271/266/347/227/205/347/250/213/345/275/225/346/250/241/346/235/277.json +0 -86
  297. package/src/med_editor//347/227/205/347/250/213/345/275/225//346/227/245/345/270/270/347/227/205/347/250/213/350/256/260/345/275/225.json +0 -115
  298. package/src/med_editor//347/227/205/347/250/213/345/275/225//346/237/245/346/210/277/350/256/260/345/275/2251.json +0 -108
  299. package/src/med_editor//347/227/205/347/250/213/345/275/225//351/246/226/346/254/241/344/270/212/347/272/247/345/214/273/345/270/210/346/237/245/346/210/277/350/256/260/345/275/225.json +0 -272
  300. package/src/med_editor//351/225/277/346/234/237/345/214/273/345/230/261/345/215/225.json +0 -1070
@@ -0,0 +1,1463 @@
1
+ import { nanoid } from "nanoid";
2
+ import { BranchElement, LeafElement, Rect } from "./element-define";
3
+ import { TextProps } from "./element-props";
4
+ import { CommsContainerElement } from "./impl/comments/comments-container-impl";
5
+ import { DataElementInlineGroup } from "./impl/data-element/data-element-base-impl";
6
+ import { DocumentBodyElement } from "./impl/document/doc-body-impl";
7
+ import { DocumentFooterElement } from "./impl/document/doc-footer-impl";
8
+ import { DocumentHeaderElement } from "./impl/document/doc-header-impl";
9
+ import { DocumentRenderObject } from "./impl/document/doc-impl";
10
+ import { ParagraphElement, ParagraphLineRectRenderObject, ParagraphRenderObject } from "./impl/paragraph/p-impl";
11
+ import { PSymbolElement } from "./impl/symbol/p-symbol-impl";
12
+ import { TableCellElement } from "./impl/table/table-cell-impl";
13
+ import { TableRenderObject } from "./impl/table/table-impl";
14
+ import { TableRowRenderObject } from "./impl/table/table-row-impl";
15
+ import { TextGroupElement, TextGroupRenderObject } from "./impl/text/text-impl";
16
+ import { TrackRunElement } from "./impl/text/track-run-impl";
17
+ import { BranchRenderObject, LeafRenderObject } from "./render-define";
18
+ export class ElementUtil {
19
+ static setCanvasProps(canvas, ctx, viewOptions, scale = 1) {
20
+ // if (canvas instanceof OffscreenCanvas) {
21
+ // this.setOffscreenCanvas(canvas, ctx as OffscreenCanvasRenderingContext2D, viewOptions, scale);
22
+ // return
23
+ // }
24
+ const { width, height } = viewOptions;
25
+ let dpr = window.devicePixelRatio || 1;
26
+ if (scale > 1) {
27
+ dpr *= scale;
28
+ }
29
+ dpr = Math.ceil(dpr);
30
+ const scaleWidth = Math.floor(width * dpr) / dpr;
31
+ const scaleHeight = Math.floor(height * dpr) / dpr;
32
+ canvas.style.width = scaleWidth + 'px';
33
+ canvas.style.height = scaleHeight + 'px';
34
+ canvas.width = scaleWidth * dpr;
35
+ canvas.height = scaleHeight * dpr;
36
+ ctx.scale(dpr, dpr);
37
+ }
38
+ // static setOffscreenCanvas(canvas: OffscreenCanvas, ctx: OffscreenCanvasRenderingContext2D, viewOptions: { width: number, height: number }, scale: number = 1): void {
39
+ // const { width, height } = viewOptions;
40
+ // let dpr = window.devicePixelRatio || 1;
41
+ // if (scale > 1) {
42
+ // dpr *= scale;
43
+ // }
44
+ // dpr = Math.ceil(dpr);
45
+ // const scaleWidth = Math.floor(width * dpr) / dpr;
46
+ // const scaleHeight = Math.floor(height * dpr) / dpr;
47
+ // canvas.width = scaleWidth * dpr;
48
+ // canvas.height = scaleHeight * dpr;
49
+ // ctx.scale(dpr, dpr);
50
+ // }
51
+ static getDprNumber(val, scale = 1) {
52
+ let dpr = window.devicePixelRatio || 1;
53
+ if (scale > 1) {
54
+ dpr *= scale;
55
+ }
56
+ dpr = Math.ceil(dpr);
57
+ return Math.floor(val * dpr) / dpr;
58
+ }
59
+ static readTextProps(dest, props, options) {
60
+ if (!props) {
61
+ return this.createTextProps(dest, options);
62
+ }
63
+ const textProps = dest ?? new TextProps();
64
+ textProps.color = props.color || options.defaultColor;
65
+ textProps.fontName = props.fontName || options.defaultFontName;
66
+ textProps.fontSize = props.fontSize || options.defaultFontSize;
67
+ textProps.border = props.border;
68
+ if (props.fontWeight) {
69
+ textProps.fontWeight = props.fontWeight;
70
+ }
71
+ if (props.fontStyle) {
72
+ textProps.fontStyle = props.fontStyle;
73
+ }
74
+ if (props.underline) {
75
+ textProps.underline = props.underline;
76
+ }
77
+ if (props.linethrough) {
78
+ textProps.linethrough = props.linethrough;
79
+ }
80
+ if (props.overline) {
81
+ textProps.overline = props.overline;
82
+ }
83
+ if (props.background) {
84
+ textProps.background = props.background;
85
+ }
86
+ if (props.letterSpace) {
87
+ textProps.letterSpace = props.letterSpace;
88
+ }
89
+ if (props.vertAlign) {
90
+ textProps.vertAlign = props.vertAlign;
91
+ }
92
+ return textProps;
93
+ }
94
+ static readEleBaseProps(dest, props) {
95
+ dest.id = props.id ?? nanoid(5);
96
+ dest.name = props.name;
97
+ dest.caption = props.caption;
98
+ dest.editable = props.editable ?? true;
99
+ dest.fieldName = props.fieldName;
100
+ dest.minLength = props.minLength;
101
+ dest.printable = props.printable ?? true;
102
+ dest.required = props.required;
103
+ dest.secretBrowse = props.secretBrowse;
104
+ dest.deleteable = props.deleteable;
105
+ dest.underline = props.underline;
106
+ dest.type = props.type;
107
+ return dest;
108
+ }
109
+ /**
110
+ * 获取内容区域最大高度
111
+ * @param render
112
+ * @param renderHeight
113
+ * @returns
114
+ */
115
+ static innerRectMaxHeight(render, renderHeight) {
116
+ const { padding } = render;
117
+ return renderHeight - padding.top - padding.bottom;
118
+ }
119
+ /**
120
+ * 根据内框内容高度,更新外框框体高度
121
+ * @param render
122
+ * @param innerRect
123
+ */
124
+ static updateRenderHeightByInnerRect(render, innerRect) {
125
+ const { padding, margin } = render;
126
+ //外层容器高度等于内容高度+外边距+内边距
127
+ render.rect.height = innerRect.height + margin.top + margin.bottom + padding.top + padding.bottom;
128
+ }
129
+ /**
130
+ * 设置块级元素限制尺寸
131
+ * @param render
132
+ * @param parentLimitRect
133
+ */
134
+ static setBlockElementLimitSize(render, parentLimitRect) {
135
+ render.rect.x = parentLimitRect.x;
136
+ render.rect.y = parentLimitRect.y + parentLimitRect.height;
137
+ render.rect.width = parentLimitRect.maxWidth ?? 0;
138
+ render.rect.maxWidth = parentLimitRect.maxWidth;
139
+ if (parentLimitRect.maxHeight) {
140
+ render.rect.maxHeight = parentLimitRect.maxHeight - parentLimitRect.height;
141
+ }
142
+ }
143
+ /**
144
+ * 克隆框体
145
+ * @param rect
146
+ * @returns
147
+ */
148
+ static cloneRect(rect) {
149
+ const cloneRect = new Rect();
150
+ cloneRect.x = rect.x;
151
+ cloneRect.y = rect.y;
152
+ cloneRect.width = rect.width;
153
+ cloneRect.height = rect.height;
154
+ cloneRect.maxHeight = rect.maxHeight;
155
+ cloneRect.maxWidth = rect.maxWidth;
156
+ return cloneRect;
157
+ }
158
+ /**
159
+ * 重新限定子元素以及当前高度值,并返回内边框内容高度
160
+ * @param render
161
+ * @param resetX 测量段落外框时,内框不需要重置x,因为内框已经存在对齐
162
+ * @returns
163
+ */
164
+ static remeasure(render, resetX = true) {
165
+ if (render.rect.width === 0) {
166
+ return -1;
167
+ }
168
+ if (render instanceof TableRowRenderObject) {
169
+ return this.remeasureTableRow(render);
170
+ }
171
+ if (render instanceof TableRenderObject) {
172
+ this.remeasureTableMerge(render);
173
+ }
174
+ const innerRect = render.getInnnerRect();
175
+ for (let i = 0; i < render.length; i++) {
176
+ const line = render.getChild(i);
177
+ if (resetX) {
178
+ line.rect.x = innerRect.x;
179
+ }
180
+ line.rect.y = innerRect.height + innerRect.y + line.margin.top;
181
+ line.rect.maxWidth = innerRect.maxWidth;
182
+ innerRect.height += line.rect.height + line.margin.top + line.margin.bottom;
183
+ }
184
+ render.updateRenderHeight(innerRect);
185
+ return innerRect.height;
186
+ }
187
+ static remeasureTableRow(rowRender, foreceColIndex = -1) {
188
+ const rowEle = rowRender.element;
189
+ const rowMinHeight = rowEle.props.minHeight > 19 ? rowEle.props.minHeight : 19;
190
+ let maxCellheight = rowMinHeight;
191
+ //限制行最小高度
192
+ maxCellheight = maxCellheight < 19 ? 19 : maxCellheight;
193
+ //获取行内非纵向合并单元格的最高单元格高度
194
+ for (let i = 0; i < rowRender.length; i++) {
195
+ const cellRender = rowRender.getChild(i);
196
+ const { vMerge } = cellRender.element.props;
197
+ if (cellRender.rect.height > maxCellheight && (vMerge !== 'restart' || i === foreceColIndex)) {
198
+ maxCellheight = cellRender.rect.height;
199
+ }
200
+ }
201
+ //循环设置单元格高度为行内最大单元格高度
202
+ for (let i = 0; i < rowRender.length; i++) {
203
+ const cellRender = rowRender.getChild(i);
204
+ const cellElement = cellRender.element;
205
+ const { vMerge } = cellElement.props;
206
+ if ((vMerge !== 'restart' || i === foreceColIndex) || cellRender.rect.height < maxCellheight) {
207
+ cellRender.rect.height = maxCellheight;
208
+ }
209
+ //处理单元格内容纵向居中
210
+ this.measureCellVAlign(cellRender);
211
+ }
212
+ //设置行高
213
+ rowRender.updateRenderHeight(maxCellheight);
214
+ return maxCellheight;
215
+ }
216
+ /**
217
+ * 获取表格行绘制元素的内容高度,用于缩放行高度时,获取最小内容高度,缩放的高度不能小于内容最小高度
218
+ */
219
+ static getTableRowRenderContentHeight(rowRender) {
220
+ const rowEle = rowRender.element;
221
+ let maxCellheight = 19;
222
+ //限制行最小高度
223
+ //获取行内非纵向合并单元格的最高单元格高度
224
+ for (let i = 0; i < rowRender.length; i++) {
225
+ const cellRender = rowRender.getChild(i);
226
+ const cellContentHeight = this.getTableCellRenderContentHeight(cellRender);
227
+ const { vMerge } = cellRender.element.props;
228
+ if (cellContentHeight > maxCellheight && vMerge !== 'restart') {
229
+ maxCellheight = cellContentHeight;
230
+ }
231
+ }
232
+ return maxCellheight;
233
+ }
234
+ /**
235
+ * 获取单元格内容高度
236
+ * 单元格暂不处理上下margin、padding
237
+ * @param cellRender
238
+ * @returns
239
+ */
240
+ static getTableCellRenderContentHeight(cellRender) {
241
+ let contentHeight = 0;
242
+ for (let i = 0; i < cellRender.length; i++) {
243
+ contentHeight += cellRender.getChild(i).rect.height;
244
+ }
245
+ return contentHeight;
246
+ }
247
+ /**
248
+ * 处理单元格内容纵向对齐
249
+ * @param render
250
+ */
251
+ static measureCellVAlign(render) {
252
+ const tcElement = render.element;
253
+ const { vAlign } = tcElement.props;
254
+ if (!vAlign || vAlign === 'top') {
255
+ return;
256
+ }
257
+ let sumHeight = 0;
258
+ for (let i = 0; i < render.length; i++) {
259
+ sumHeight += render.getChild(i).rect.height;
260
+ }
261
+ let spaceHeight = 0;
262
+ spaceHeight = vAlign === 'middle' ? Math.floor((render.rect.height - sumHeight) / 2) : vAlign === 'bottom' ? render.rect.height - sumHeight : 0;
263
+ if (spaceHeight <= 0) {
264
+ return;
265
+ }
266
+ let y = spaceHeight;
267
+ for (let i = 0; i < render.length; i++) {
268
+ render.getChild(i).rect.y = y;
269
+ y += render.getChild(i).rect.height;
270
+ }
271
+ }
272
+ /**
273
+ * 重新测量合并单元格高度
274
+ * @param tbRender
275
+ * @returns
276
+ */
277
+ static remeasureTableMerge(tbRender) {
278
+ //是否需要重新计算,主要解决:之前合并计算的列,可能会被后面合并计算的列所影响,需要再次重新计算测量
279
+ let needReCalc = false;
280
+ for (let i = 0; i < tbRender.length; i++) {
281
+ const row = tbRender.getChild(i);
282
+ for (let j = 0; j < row.length; j++) {
283
+ const cellRender = row.getChild(j);
284
+ const ele = cellRender.element;
285
+ const { vMerge } = ele.props;
286
+ if (vMerge === 'restart') {
287
+ const eleIndex = ele.getIndex();
288
+ const continueRows = this.getContinueVMergeRenderRows(tbRender, i, eleIndex);
289
+ if (!continueRows.length) {
290
+ //向下不存在合并的单元格,当前合并的单元格是被cut过来的,并且当前单元格高度高于行内高度需要remeasure当前行
291
+ if (cellRender.rect.height > row.rect.height) {
292
+ this.remeasureTableRow(row, j);
293
+ needReCalc = true;
294
+ }
295
+ continue;
296
+ }
297
+ const continueCellHeight = continueRows.reduce((prev, curr) => prev + curr.rect.height, 0);
298
+ const overflowHeight = cellRender.rect.height - row.rect.height - continueCellHeight;
299
+ //溢出的高度加到最后一个合并单元格中
300
+ if (overflowHeight > 0) {
301
+ const lastRow = continueRows[continueRows.length - 1];
302
+ lastRow.rect.height += overflowHeight;
303
+ this.resizeCellToFillRow(lastRow);
304
+ needReCalc = true;
305
+ }
306
+ else {
307
+ cellRender.rect.height = row.rect.height + continueCellHeight;
308
+ }
309
+ }
310
+ }
311
+ }
312
+ if (needReCalc) {
313
+ this.remeasureTableMerge(tbRender);
314
+ return;
315
+ }
316
+ }
317
+ /**
318
+ * 获取向下纵向合并的行
319
+ * @param render
320
+ * @param rowIndex
321
+ * @param colIndex
322
+ * @returns
323
+ */
324
+ static getContinueVMergeRenderRows(render, rowIndex, colIndex) {
325
+ const rows = [];
326
+ for (let i = rowIndex + 1; i < render.length; i++) {
327
+ const rowRender = render.getChild(i);
328
+ const rowEle = rowRender.element;
329
+ const ele = rowEle.getChild(colIndex);
330
+ const { vMerge } = ele.props;
331
+ if (vMerge !== 'continue') {
332
+ break;
333
+ }
334
+ rows.push(rowRender);
335
+ }
336
+ return rows;
337
+ }
338
+ /**
339
+ * 根据横向当前被合并的单元格
340
+ * @param tb
341
+ * @param rowIndex
342
+ * @param colIndex
343
+ */
344
+ static getHorizontalRestartCellIndex(tb, rowIndex, colIndex) {
345
+ const row = tb.getChild(rowIndex);
346
+ for (let i = colIndex - 1; i >= 0; i--) {
347
+ const cell = row.getChild(i);
348
+ if (cell.props.hMerge === 'restart') {
349
+ return i;
350
+ }
351
+ }
352
+ throw new Error('未找到主合并单元格');
353
+ }
354
+ /**
355
+ * 根据横向当前被合并的单元格
356
+ * @param tb
357
+ * @param rowIndex
358
+ * @param colIndex
359
+ */
360
+ static getVerticalRestartCellIndex(tb, rowIndex, colIndex) {
361
+ for (let i = rowIndex - 1; i >= 0; i--) {
362
+ const row = tb.getChild(i);
363
+ const cell = row.getChild(colIndex);
364
+ if (cell.props.vMerge === 'restart') {
365
+ return i;
366
+ }
367
+ }
368
+ throw new Error('未找到横向当前被合并的单元格');
369
+ }
370
+ /**
371
+ * 获取合并单元格主单元格
372
+ * @param tb
373
+ * @param rowIndex
374
+ * @param colIndex
375
+ * @returns
376
+ */
377
+ static getRestartCellPosition(tb, rowIndex, colIndex) {
378
+ const row = tb.getChild(rowIndex);
379
+ const cell = row.getChild(colIndex);
380
+ if (cell.props.hMerge === 'continue') {
381
+ const restartCellIndex = this.getHorizontalRestartCellIndex(tb, rowIndex, colIndex);
382
+ return this.getRestartCellPosition(tb, rowIndex, restartCellIndex);
383
+ }
384
+ if (cell.props.vMerge === 'continue') {
385
+ const restartRowIndex = this.getVerticalRestartCellIndex(tb, rowIndex, colIndex);
386
+ return this.getRestartCellPosition(tb, restartRowIndex, colIndex);
387
+ }
388
+ return { rowIndex, colIndex };
389
+ }
390
+ /**
391
+ * 调整单元格高度填满整个行的高度
392
+ */
393
+ static resizeCellToFillRow(row) {
394
+ for (let i = 0; i < row.length; i++) {
395
+ const cell = row.getChild(i);
396
+ cell.rect.height = row.rect.height;
397
+ }
398
+ }
399
+ /**
400
+ * 获取元素的全局索引位置
401
+ * @param control
402
+ * @returns
403
+ */
404
+ static getControlIndex(control) {
405
+ const parent = control.parent;
406
+ if (parent) {
407
+ const index = control.getIndex();
408
+ let counter = 1;
409
+ for (let i = 0; i < index; i++) {
410
+ const child = parent.getChild(i);
411
+ counter += child.getSelfLength();
412
+ }
413
+ return counter + this.getControlIndex(parent);
414
+ }
415
+ else {
416
+ return 0;
417
+ }
418
+ }
419
+ /**
420
+ * 根据全局索引位置获取元素
421
+ * @param control
422
+ * @param counter
423
+ * @returns
424
+ */
425
+ static getControlByIndex(control, counter) {
426
+ counter.currIndex++;
427
+ if (counter.currIndex === counter.index) {
428
+ return control;
429
+ }
430
+ if (control instanceof LeafElement) {
431
+ return null;
432
+ }
433
+ else if (control instanceof BranchElement) {
434
+ for (let i = 0; i < control.length; i++) {
435
+ const res = this.getControlByIndex(control.getChild(i), counter);
436
+ if (res) {
437
+ return res;
438
+ }
439
+ }
440
+ }
441
+ return null;
442
+ }
443
+ /**
444
+ * 获取同级紧挨前方的兄弟元素
445
+ * @param element
446
+ * @returns
447
+ */
448
+ static getPrevSiblingElement(element) {
449
+ const parent = element.parent;
450
+ if (!parent) {
451
+ return null;
452
+ }
453
+ if (parent) {
454
+ const index = parent.getChildIndex(element);
455
+ if (index > 0) {
456
+ return parent.getChild(index - 1);
457
+ }
458
+ }
459
+ return null;
460
+ }
461
+ /**
462
+ * 获取同级紧挨下方的元素
463
+ * @param element
464
+ * @returns
465
+ */
466
+ static getNextSiblingElement(element) {
467
+ const parent = element.parent;
468
+ if (!parent) {
469
+ return null;
470
+ }
471
+ if (parent) {
472
+ const index = parent.getChildIndex(element);
473
+ if (index < parent.length - 1) {
474
+ return parent.getChild(index + 1);
475
+ }
476
+ }
477
+ return null;
478
+ }
479
+ static getNextSiblingTrackElement(element, type, userId) {
480
+ const nextSiblingEle = this.getNextSiblingElement(element);
481
+ if (nextSiblingEle instanceof TrackRunElement) {
482
+ if (nextSiblingEle.type === type && nextSiblingEle.props.userId === userId) {
483
+ return nextSiblingEle;
484
+ }
485
+ }
486
+ return null;
487
+ }
488
+ static getPrevSiblingTrackElement(element, type, userId) {
489
+ const prevSiblingEle = this.getPrevSiblingElement(element);
490
+ if (prevSiblingEle instanceof TrackRunElement) {
491
+ if (prevSiblingEle.type === type && prevSiblingEle.props.userId === userId) {
492
+ return prevSiblingEle;
493
+ }
494
+ }
495
+ return null;
496
+ }
497
+ /**
498
+ * 根据默认配置创建长文本
499
+ * @param viewOptions
500
+ * @returns
501
+ */
502
+ static getNewTextGroup(textProps) {
503
+ const text = new TextGroupElement();
504
+ textProps.clone(text.props);
505
+ return text;
506
+ }
507
+ static createTextProps(dest, viewOptions) {
508
+ const textProps = dest ?? new TextProps();
509
+ textProps.fontSize = viewOptions.defaultFontSize;
510
+ textProps.fontName = viewOptions.defaultFontName;
511
+ textProps.color = viewOptions.defaultColor;
512
+ return textProps;
513
+ }
514
+ /**
515
+ * 获取容器内的最小渲染元素集合
516
+ * @param parPos
517
+ * @param array
518
+ */
519
+ static getAvailHitLeafRenderObjects(render, parPos) {
520
+ if (!this.checkAvailHitRender(render)) {
521
+ return [];
522
+ }
523
+ const renderObjectRect = {
524
+ x: parPos.x + render.rect.x,
525
+ y: parPos.y + render.rect.y,
526
+ width: render.rect.width,
527
+ height: render.rect.height,
528
+ maxWidth: 0,
529
+ maxHeight: 0
530
+ };
531
+ const array = [];
532
+ if (render instanceof BranchRenderObject) {
533
+ for (let i = 0; i < render.length; i++) {
534
+ const child = render.getChild(i);
535
+ array.push(...this.getAvailHitLeafRenderObjects(child, { x: renderObjectRect.x, y: renderObjectRect.y }));
536
+ }
537
+ }
538
+ else if (render instanceof LeafRenderObject) {
539
+ array.push({ render: render, rect: renderObjectRect });
540
+ }
541
+ else {
542
+ throw new Error('未实现');
543
+ }
544
+ return array;
545
+ }
546
+ /**
547
+ * 获取容器内的最小渲染元素集合
548
+ * @param parPos
549
+ * @param array
550
+ */
551
+ static getAvailHitRenderObjects(render, parPos) {
552
+ if (!this.checkAvailHitRender(render)) {
553
+ return [];
554
+ }
555
+ const renderObjectRect = this.getRenderObjectAbsoluteRect(render, parPos);
556
+ const array = [];
557
+ if (render instanceof BranchRenderObject) {
558
+ for (let i = 0; i < render.length; i++) {
559
+ const child = render.getChild(i);
560
+ if (this.checkAvailHitRender(child)) {
561
+ array.push({ render: child, rect: this.getRenderObjectAbsoluteRect(child, renderObjectRect) });
562
+ }
563
+ }
564
+ }
565
+ else if (render instanceof LeafRenderObject) {
566
+ array.push({ render: render, rect: renderObjectRect });
567
+ }
568
+ else {
569
+ throw new Error('未实现');
570
+ }
571
+ return array;
572
+ }
573
+ /**
574
+ * 获取绘制元素的绝对位置框
575
+ */
576
+ static getRenderObjectAbsoluteRect(render, parPos) {
577
+ const renderObjectRect = {
578
+ x: parPos.x + render.rect.x,
579
+ y: parPos.y + render.rect.y,
580
+ width: render.rect.width,
581
+ height: render.rect.height,
582
+ maxWidth: 0,
583
+ maxHeight: 0
584
+ };
585
+ return renderObjectRect;
586
+ }
587
+ /**
588
+ * 检查当前绘制元素是否属于有效点击元素
589
+ */
590
+ static checkAvailHitRender(render) {
591
+ if (render.element && render.element.disableClick) {
592
+ return false;
593
+ }
594
+ if (render instanceof TableRowRenderObject) {
595
+ const rowEle = render.element;
596
+ if (rowEle.props.headerRow) {
597
+ return rowEle.paintRenders.indexOf(render) === 0;
598
+ }
599
+ }
600
+ return !render.disableClick;
601
+ }
602
+ /**
603
+ * 验证点击可操作性
604
+ * 主要限制页眉页脚的编辑模式
605
+ */
606
+ static verifyHitable(sourceElement) {
607
+ if (!sourceElement) {
608
+ return false;
609
+ }
610
+ const parents = ElementUtil.getParentElements(sourceElement);
611
+ for (let i = parents.length - 1; i >= 0; i--) {
612
+ const child = parents[i];
613
+ if (child.disableClick) {
614
+ return false;
615
+ }
616
+ }
617
+ return true;
618
+ }
619
+ /**
620
+ * 获取一个点到一个矩形最短的距离
621
+ * @param rect
622
+ * @param p
623
+ * @returns
624
+ */
625
+ static getDistanceToRect(rect, p) {
626
+ const lines = [];
627
+ lines.push({
628
+ f: {
629
+ x: rect.x,
630
+ y: rect.y
631
+ },
632
+ s: {
633
+ x: rect.x + rect.width,
634
+ y: rect.y
635
+ }
636
+ }, {
637
+ f: {
638
+ x: rect.x,
639
+ y: rect.y
640
+ },
641
+ s: {
642
+ x: rect.x,
643
+ y: rect.y + rect.height
644
+ }
645
+ }, {
646
+ f: {
647
+ x: rect.x,
648
+ y: rect.y + rect.height
649
+ },
650
+ s: {
651
+ x: rect.x + rect.width,
652
+ y: rect.y + rect.height
653
+ }
654
+ }, {
655
+ f: {
656
+ x: rect.x + rect.width,
657
+ y: rect.y
658
+ },
659
+ s: {
660
+ x: rect.x + rect.width,
661
+ y: rect.y + rect.height
662
+ }
663
+ });
664
+ const distances = lines.map(item => this.minDistance(item.f, item.s, p));
665
+ return Math.min(...distances);
666
+ }
667
+ static minDistance(A, B, E) {
668
+ const AB = { x: B.x - A.x, y: B.y - A.y };
669
+ const BE = { x: E.x - B.x, y: E.y - B.y };
670
+ const AE = { x: E.x - A.x, y: E.y - A.y };
671
+ const AB_BE = (AB.x * BE.x + AB.y * BE.y);
672
+ const AB_AE = (AB.x * AE.x + AB.y * AE.y);
673
+ let reqAns = 0;
674
+ if (AB_BE > 0) {
675
+ const y = E.y - B.y;
676
+ const x = E.x - B.x;
677
+ reqAns = Math.sqrt(x * x + y * y);
678
+ }
679
+ else if (AB_AE < 0) {
680
+ const y = E.y - A.y;
681
+ const x = E.x - A.x;
682
+ reqAns = Math.sqrt(x * x + y * y);
683
+ }
684
+ else {
685
+ const x1 = AB.x;
686
+ const y1 = AB.y;
687
+ const x2 = AE.x;
688
+ const y2 = AE.y;
689
+ const mod = Math.sqrt(x1 * x1 + y1 * y1);
690
+ reqAns = Math.abs(x1 * y2 - y1 * x2) / mod;
691
+ }
692
+ return reqAns;
693
+ }
694
+ /**
695
+ * 获取父级层级渲染对象
696
+ * @param render
697
+ * @returns
698
+ */
699
+ static getParentRenders(render) {
700
+ if (render) {
701
+ return [render, ...this.getParentRenders(render.parent)];
702
+ }
703
+ else {
704
+ return [];
705
+ }
706
+ }
707
+ static getRenderMapElements(render) {
708
+ const renders = this.getParentRenders(render);
709
+ return renders.map(render => render.element).filter(ele => ele);
710
+ }
711
+ static getParentRender(child, parentType) {
712
+ if (!child) {
713
+ return null;
714
+ }
715
+ if (child instanceof parentType) {
716
+ return child;
717
+ }
718
+ else {
719
+ return this.getParentRender(child.parent, parentType);
720
+ }
721
+ }
722
+ static getParentRenderByPredicate(child, predicate) {
723
+ if (!child) {
724
+ return null;
725
+ }
726
+ if (predicate(child)) {
727
+ return child;
728
+ }
729
+ else {
730
+ return this.getParentRenderByPredicate(child.parent, predicate);
731
+ }
732
+ }
733
+ /**
734
+ * 获取父级层级元素对象
735
+ * @param element
736
+ * @returns
737
+ */
738
+ static getParentElements(element) {
739
+ if (element) {
740
+ return [element, ...this.getParentElements(element.parent)];
741
+ }
742
+ else {
743
+ return [];
744
+ }
745
+ }
746
+ /**
747
+ * 获取最后一个子元素
748
+ * @param element
749
+ * @returns
750
+ */
751
+ static getLastLeafElement(element, predicate = null) {
752
+ if (element instanceof LeafElement && (!predicate || predicate(element))) {
753
+ return element;
754
+ }
755
+ else if (element instanceof BranchElement) {
756
+ for (let i = element.length - 1; i >= 0; i--) {
757
+ const res = this.getLastLeafElement(element.getChild(i), predicate);
758
+ if (res) {
759
+ return res;
760
+ }
761
+ }
762
+ return null;
763
+ }
764
+ return null;
765
+ }
766
+ /**
767
+ * 获取第一个子元素
768
+ * @param element
769
+ * @returns
770
+ */
771
+ static getFirstLeafElement(element) {
772
+ if (element instanceof LeafElement) {
773
+ return element;
774
+ }
775
+ else if (element instanceof BranchElement) {
776
+ for (let i = 0; i < element.length; i++) {
777
+ const res = this.getFirstLeafElement(element.getChild(i));
778
+ if (res) {
779
+ return res;
780
+ }
781
+ }
782
+ return null;
783
+ }
784
+ return null;
785
+ }
786
+ /**
787
+ * 校验两个元素是否在同一个段落中
788
+ * @param element1
789
+ * @param element2
790
+ */
791
+ static isInSameParagraph(element1, element2) {
792
+ const par1 = this.getParentByType(element1, ParagraphElement);
793
+ const par2 = this.getParentByType(element2, ParagraphElement);
794
+ return par1 === par2;
795
+ }
796
+ static getBorderCursor(borderType) {
797
+ switch (borderType) {
798
+ case 'none':
799
+ return 'text';
800
+ case 'top':
801
+ return 'row-resize';
802
+ case 'left':
803
+ return 'col-resize';
804
+ case 'right':
805
+ return 'col-resize';
806
+ case 'bottom':
807
+ return 'row-resize';
808
+ case 'left-middle':
809
+ case 'right-middle':
810
+ return 'w-resize';
811
+ case 'top-middle':
812
+ case 'bottom-middle':
813
+ return 's-resize';
814
+ case 'left-top':
815
+ case 'right-bottom':
816
+ return 'se-resize';
817
+ case 'right-top':
818
+ case 'left-bottom':
819
+ return 'ne-resize';
820
+ default:
821
+ return 'text';
822
+ }
823
+ }
824
+ static getParentByType(child, parentType) {
825
+ if (!child) {
826
+ return null;
827
+ }
828
+ if (child instanceof parentType) {
829
+ return child;
830
+ }
831
+ else {
832
+ return this.getParentByType(child.parent, parentType);
833
+ }
834
+ }
835
+ static getParent(child, predicate) {
836
+ if (!child) {
837
+ return null;
838
+ }
839
+ if (predicate(child)) {
840
+ return child;
841
+ }
842
+ else {
843
+ return this.getParent(child.parent, predicate);
844
+ }
845
+ }
846
+ /**
847
+ * 修正段落内容
848
+ * @returns
849
+ */
850
+ static fixParagraphContent(control) {
851
+ //如果最后一个元素不是段落符号,则补足
852
+ if (!(control.getChild(control.length - 1) instanceof PSymbolElement)) {
853
+ control.addChild(new PSymbolElement());
854
+ }
855
+ const items = [];
856
+ for (let i = 0; i < control.length - 1; i++) {
857
+ const child = control.getChild(i);
858
+ if (child instanceof PSymbolElement) {
859
+ items.push(child);
860
+ }
861
+ }
862
+ items.forEach(item => {
863
+ control.removeChild(item);
864
+ });
865
+ }
866
+ /**
867
+ * 修正块级容器内容
868
+ * @param control
869
+ */
870
+ static fixBlockContainer(control) {
871
+ if (control.length === 0) {
872
+ if (control instanceof TableCellElement && (control.props.vMerge === 'continue' || control.props.hMerge === 'continue')) {
873
+ return;
874
+ }
875
+ if (control.noFillEmpty) {
876
+ return;
877
+ }
878
+ control.addChild(new ParagraphElement());
879
+ }
880
+ }
881
+ /**
882
+ * 获取绘制元素相对于整个画布的绝对位置
883
+ * 整个画布绘制的时候不一定从x=0,y=0时绘制的,下拉滚动时,上面从负y坐标开始绘制
884
+ * 如果计算某个元素相对画布的左上角的绝对坐标位置,需要childPos的y值减去translateY
885
+ * @param render
886
+ * @param refPos 参照位置
887
+ * @returns
888
+ */
889
+ static getRenderAbsolutePaintPos(render, refPos = null) {
890
+ refPos = refPos ?? { x: 0, y: 0 };
891
+ const currPos = { x: render.rect.x + refPos.x, y: render.rect.y + refPos.y };
892
+ if (!render.parent) {
893
+ return currPos;
894
+ }
895
+ return this.getRenderAbsolutePaintPos(render.parent, currPos);
896
+ }
897
+ static getRenderAbsolutePaintRect(render, childPos = null) {
898
+ const pos = this.getRenderAbsolutePaintPos(render, childPos);
899
+ return { ...pos, width: render.rect.width, height: render.rect.height, maxWidth: 0, maxHeight: 0 };
900
+ }
901
+ /**
902
+ * 获取选中区域的开始区域
903
+ * @param range
904
+ * @returns
905
+ */
906
+ static getFirstSelectedRange(range) {
907
+ if (range.selectedChildren.length === 0 || range.target instanceof TextGroupElement) {
908
+ return range;
909
+ }
910
+ else {
911
+ return this.getFirstSelectedRange(range.selectedChildren[0]);
912
+ }
913
+ }
914
+ /**
915
+ * 获取选中区域的开始区域
916
+ * @param range \
917
+ * @returns
918
+ */
919
+ static getLastSelectedRange(range) {
920
+ if (range.selectedChildren.length === 0 || range.target instanceof TextGroupElement) {
921
+ return range;
922
+ }
923
+ else {
924
+ return this.getLastSelectedRange(range.selectedChildren[range.selectedChildren.length - 1]);
925
+ }
926
+ }
927
+ /**
928
+ * 克隆选区内容
929
+ * @param range
930
+ * @param isDelete
931
+ * @returns
932
+ */
933
+ static cloneRange(range, isDelete, cloneMode = 'clone') {
934
+ const { target, isFullSelected, startOffset, endOffset, selectedChildren } = range;
935
+ if (isFullSelected) {
936
+ //修饰元素不能复制 审阅标记、数据元NullText
937
+ if (cloneMode === 'copy' && target.isDecorate) {
938
+ return null;
939
+ }
940
+ const clone = cloneMode === 'source' ? target : target.clone(true);
941
+ if (isDelete) {
942
+ target.remove();
943
+ }
944
+ return clone;
945
+ }
946
+ else {
947
+ if (target instanceof LeafElement) {
948
+ if (target instanceof TextGroupElement && startOffset !== endOffset) {
949
+ if (isDelete) {
950
+ const copyTarget = target.spliceText(startOffset, endOffset, true);
951
+ if (target.text.length === 0) {
952
+ target.remove();
953
+ }
954
+ return copyTarget;
955
+ }
956
+ else {
957
+ const copyTarget = target.spliceText(startOffset, endOffset, false);
958
+ return copyTarget;
959
+ }
960
+ }
961
+ return null;
962
+ }
963
+ else if (target instanceof BranchElement) {
964
+ const array = [];
965
+ for (let i = 0; i < selectedChildren.length; i++) {
966
+ const copyChild = this.cloneRange(selectedChildren[i], isDelete, cloneMode);
967
+ if (copyChild) {
968
+ array.push(copyChild);
969
+ }
970
+ }
971
+ if (!array.length) {
972
+ return null;
973
+ }
974
+ else {
975
+ const copyTarget = target.clone(false);
976
+ array.forEach(item => {
977
+ copyTarget.addChild(item);
978
+ });
979
+ return copyTarget;
980
+ }
981
+ }
982
+ }
983
+ return null;
984
+ }
985
+ /**
986
+ * 获取所有的子级元素
987
+ * @param branchEle
988
+ * @returns
989
+ */
990
+ static getChildrenElements(branchEle) {
991
+ const array = [];
992
+ for (let i = 0; i < branchEle.length; i++) {
993
+ array.push(branchEle.getChild(i));
994
+ }
995
+ return array;
996
+ }
997
+ /**
998
+ * 递归向前寻找最近的元素
999
+ * @param currElement
1000
+ * @param inPara 是否在同一段落中寻找
1001
+ * @param forCursor 查找结果是否用于光标定位
1002
+ * @returns
1003
+ */
1004
+ static getRecursionPrevSiblingElement(currElement, inPara = false, forCursor = false) {
1005
+ const parent = currElement?.parent;
1006
+ //删除留痕块的measureRender在不显示留痕模式下,不生成render
1007
+ if (!currElement || !parent || (!currElement.measureRender && !(currElement instanceof TrackRunElement))) {
1008
+ return null;
1009
+ }
1010
+ //如果当前数据元不可编辑,则直接跳过
1011
+ if (parent instanceof DataElementInlineGroup && !parent.props.editable) {
1012
+ return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
1013
+ }
1014
+ if (forCursor && parent.disableClick) {
1015
+ return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
1016
+ }
1017
+ const index = parent.getChildIndex(currElement);
1018
+ if (!index) {
1019
+ if (inPara && parent.type === 'p') {
1020
+ return null;
1021
+ }
1022
+ return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
1023
+ }
1024
+ else {
1025
+ let prevElement = null;
1026
+ for (let i = index - 1; i >= 0; i--) {
1027
+ prevElement = parent.getChild(i);
1028
+ if (prevElement && !prevElement.disableClick) {
1029
+ break;
1030
+ }
1031
+ }
1032
+ if (!prevElement || prevElement.disableClick) {
1033
+ return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
1034
+ }
1035
+ const lastLeafElement = ElementUtil.getLastLeafElement(prevElement);
1036
+ //用于光标定位
1037
+ if (forCursor && lastLeafElement && lastLeafElement.disableClick) {
1038
+ return this.getRecursionPrevSiblingElement(lastLeafElement, inPara, forCursor);
1039
+ }
1040
+ if (lastLeafElement) {
1041
+ return lastLeafElement;
1042
+ }
1043
+ else {
1044
+ return this.getRecursionPrevSiblingElement(prevElement.parent, inPara, forCursor);
1045
+ }
1046
+ }
1047
+ }
1048
+ /**
1049
+ * 循环向前寻找可定位的数据元
1050
+ * @param currElement
1051
+ */
1052
+ static getPrevDataElement(ctx, currElement) {
1053
+ const dataEle = ctx.getCurrentCtx(currElement).getControlInstanceList().filter(item => item instanceof DataElementInlineGroup);
1054
+ const index = dataEle.indexOf(currElement);
1055
+ if (index > 0) {
1056
+ for (let i = index - 1; i >= 0; i--) {
1057
+ if (!dataEle[i].disableClick && dataEle[i].props.editable) {
1058
+ return dataEle[i];
1059
+ }
1060
+ }
1061
+ }
1062
+ return null;
1063
+ }
1064
+ // /**
1065
+ // * 递归向前寻找最近的可点击元素
1066
+ // */
1067
+ // static getRecursionPrevSiblingElementForHit(currElement: Element | null): LeafElement | null {
1068
+ // let ele: LeafElement | null = null;
1069
+ // do {
1070
+ // ele = this.getRecursionPrevSiblingElement(currElement);
1071
+ // } while (ele && ele.disableClick)
1072
+ // return ele;
1073
+ // }
1074
+ // /**
1075
+ // * 在同一段落中,递归向前寻找最近的元素
1076
+ // */
1077
+ // static getRecursionPrevSiblingElementInPara(currElement: Element | null): LeafElement | null {
1078
+ // const parent = currElement?.parent;
1079
+ // if (!currElement || !parent) {
1080
+ // return null;
1081
+ // }
1082
+ // const index = parent.getChildIndex(currElement);
1083
+ // if (!index) {
1084
+ // if (parent.type === 'p') {
1085
+ // return null;
1086
+ // }
1087
+ // return this.getRecursionPrevSiblingElementInPara(parent);
1088
+ // } else {
1089
+ // const prevElement = parent.getChild(index - 1);
1090
+ // const lastLeafElement = ElementUtil.getLastLeafElement(prevElement);
1091
+ // if (lastLeafElement) {
1092
+ // return lastLeafElement;
1093
+ // } else {
1094
+ // return this.getRecursionPrevSiblingElementInPara(prevElement?.parent);
1095
+ // }
1096
+ // }
1097
+ // }
1098
+ // /**
1099
+ // * 在同一段落中,递归向前寻找最近的可点击元素
1100
+ // */
1101
+ // static getRecursionPrevSiblingElementInParaForHit(currElement: Element | null): LeafElement | null {
1102
+ // let ele: LeafElement | null = null;
1103
+ // do {
1104
+ // ele = this.getRecursionPrevSiblingElementInPara(currElement);
1105
+ // } while (ele && ele.disableClick)
1106
+ // return ele;
1107
+ // }
1108
+ /**
1109
+ * 递归向后寻找最近的元素
1110
+ */
1111
+ static getRecursionNextSiblingElement(currElement, inPara = false, forCursor = false) {
1112
+ const parent = currElement?.parent;
1113
+ if (!currElement || !parent || !currElement.measureRender) {
1114
+ return null;
1115
+ }
1116
+ //如果当前数据元不可编辑,则直接跳过
1117
+ if (parent instanceof DataElementInlineGroup && !parent.props.editable) {
1118
+ return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
1119
+ }
1120
+ if (forCursor && parent.disableClick) {
1121
+ return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
1122
+ }
1123
+ const index = parent.getChildIndex(currElement);
1124
+ if (index === parent.length - 1) {
1125
+ if (inPara && parent.type === 'p') {
1126
+ return null;
1127
+ }
1128
+ return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
1129
+ }
1130
+ else {
1131
+ let nextElement = null;
1132
+ for (let i = index + 1; i < parent.length; i++) {
1133
+ nextElement = parent.getChild(i);
1134
+ if (nextElement && !nextElement.disableClick) {
1135
+ break;
1136
+ }
1137
+ }
1138
+ if (!nextElement || nextElement.disableClick) {
1139
+ return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
1140
+ }
1141
+ const lastLeafElement = ElementUtil.getFirstLeafElement(nextElement);
1142
+ //用于光标定位
1143
+ if (forCursor && lastLeafElement && lastLeafElement.disableClick) {
1144
+ return this.getRecursionNextSiblingElement(lastLeafElement, inPara, forCursor);
1145
+ }
1146
+ if (lastLeafElement) {
1147
+ return lastLeafElement;
1148
+ }
1149
+ else {
1150
+ return this.getRecursionNextSiblingElement(nextElement.parent, inPara, forCursor);
1151
+ }
1152
+ }
1153
+ }
1154
+ // /**
1155
+ // * 在同一段落中,递归向后寻找最近的元素
1156
+ // */
1157
+ // static getRecursionNextSiblingElementInPara(currElement: Element | null): LeafElement | null {
1158
+ // const parent = currElement?.parent;
1159
+ // if (!currElement || !parent) {
1160
+ // return null;
1161
+ // }
1162
+ // const index = parent.getChildIndex(currElement);
1163
+ // if (index === parent.length - 1) {
1164
+ // if (parent.type === 'p') {
1165
+ // return null;
1166
+ // }
1167
+ // return this.getRecursionNextSiblingElementInPara(parent);
1168
+ // } else {
1169
+ // const nextElement = parent.getChild(index + 1);
1170
+ // const lastLeafElement = ElementUtil.getFirstLeafElement(nextElement);
1171
+ // if (lastLeafElement) {
1172
+ // return lastLeafElement;
1173
+ // } else {
1174
+ // return this.getRecursionNextSiblingElementInPara(nextElement.parent);
1175
+ // }
1176
+ // }
1177
+ // }
1178
+ // /**
1179
+ // * 在同一段落中,递归向后寻找最近的可点击元素
1180
+ // */
1181
+ // static getRecursionNextSiblingElementInParaForHit(currElement: Element | null): LeafElement | null {
1182
+ // let ele: LeafElement | null = null;
1183
+ // do {
1184
+ // ele = this.getRecursionNextSiblingElementInPara(currElement);
1185
+ // } while (ele && ele.disableClick)
1186
+ // return ele;
1187
+ // }
1188
+ // /**
1189
+ // * 在同一段落中,递归向后寻找最近的可点击元素
1190
+ // */
1191
+ // static getRecursionNextSiblingElementForHit(currElement: Element | null): LeafElement | null {
1192
+ // let ele: LeafElement | null = null;
1193
+ // do {
1194
+ // ele = this.getRecursionNextSiblingElement(currElement);
1195
+ // } while (ele && ele.disableClick)
1196
+ // return ele;
1197
+ // }
1198
+ /**
1199
+ * 获取行内最大渲染单元格高度,主要处理纵向合并单元格问题
1200
+ * @param row
1201
+ * @returns
1202
+ */
1203
+ static getRowMaxCellHeight(row) {
1204
+ let maxHeight = 0;
1205
+ for (let i = 0; i < row.length; i++) {
1206
+ if (row.getChild(i).rect.height > maxHeight) {
1207
+ maxHeight = row.getChild(i).rect.height;
1208
+ }
1209
+ }
1210
+ return maxHeight;
1211
+ }
1212
+ /**
1213
+ * 校验是否为空内容
1214
+ * @param ele
1215
+ */
1216
+ static checkEmptyContent(ele) {
1217
+ if (ele.length === 1) {
1218
+ const firstRender = ele.getChild(0);
1219
+ if (firstRender instanceof ParagraphRenderObject) {
1220
+ if ((firstRender.element).length === 1) {
1221
+ return true;
1222
+ }
1223
+ }
1224
+ }
1225
+ return false;
1226
+ }
1227
+ /**
1228
+ * 测量行内编组元素
1229
+ * @param render
1230
+ */
1231
+ static remeasureInlineGroupRender(render) {
1232
+ let x = 0;
1233
+ let maxHeight = 0;
1234
+ for (let i = 0; i < render.length; i++) {
1235
+ const item = render.getChild(i);
1236
+ item.rect.x = x;
1237
+ if (item.rect.height > maxHeight) {
1238
+ maxHeight = item.rect.height;
1239
+ }
1240
+ x += item.rect.width;
1241
+ }
1242
+ for (let i = 0; i < render.length; i++) {
1243
+ const item = render.getChild(i);
1244
+ item.rect.y = maxHeight - item.rect.height;
1245
+ }
1246
+ render.rect.width = x;
1247
+ render.rect.height = maxHeight;
1248
+ }
1249
+ static getParaLinePos(childRender, childRenderPos) {
1250
+ const parent = childRender.parent;
1251
+ const rect = ElementUtil.cloneRect(parent.rect);
1252
+ rect.x = childRenderPos.x - childRender.rect.x;
1253
+ rect.y = childRenderPos.y - childRender.rect.y;
1254
+ if (parent instanceof ParagraphLineRectRenderObject) {
1255
+ return rect;
1256
+ }
1257
+ else {
1258
+ return this.getParaLinePos(parent, rect);
1259
+ }
1260
+ }
1261
+ static getParentRenderPos(parentRender, childRender, childRenderPos) {
1262
+ const parent = childRender.parent;
1263
+ const rect = ElementUtil.cloneRect(parent.rect);
1264
+ rect.x = childRenderPos.x - childRender.rect.x;
1265
+ rect.y = childRenderPos.y - childRender.rect.y;
1266
+ if (parent === parentRender) {
1267
+ return rect;
1268
+ }
1269
+ else {
1270
+ return this.getParentRenderPos(parentRender, parent, rect);
1271
+ }
1272
+ }
1273
+ /**
1274
+ * 获取绘制元素所在的区域
1275
+ */
1276
+ static getRenderObjectRegion(render) {
1277
+ if (!render) {
1278
+ return undefined;
1279
+ }
1280
+ if (render.element) {
1281
+ return this.getElementRegion(render.element);
1282
+ }
1283
+ return this.getRenderObjectRegion(render.parent);
1284
+ }
1285
+ /**
1286
+ * 获取文档元素所在的区域
1287
+ * @param element
1288
+ * @returns
1289
+ */
1290
+ static getElementRegion(element) {
1291
+ const regionTarget = this.getElementRegionTarget(element);
1292
+ return regionTarget?.type;
1293
+ }
1294
+ static getElementRegionTarget(element) {
1295
+ if (!element) {
1296
+ return null;
1297
+ }
1298
+ if (element instanceof DocumentBodyElement) {
1299
+ return { type: 'body', target: element };
1300
+ }
1301
+ if (element instanceof DocumentFooterElement) {
1302
+ return { type: 'footer', target: element };
1303
+ }
1304
+ if (element instanceof DocumentHeaderElement) {
1305
+ return { type: 'header', target: element };
1306
+ }
1307
+ if (element instanceof CommsContainerElement) {
1308
+ return { type: 'review', target: element };
1309
+ }
1310
+ return this.getElementRegionTarget(element.parent);
1311
+ }
1312
+ /**
1313
+ * 根据坐标系统偏移位获取所在的文本偏移位置
1314
+ * @param textRender
1315
+ * @param x
1316
+ * @returns
1317
+ */
1318
+ static getTextRenderOffset(textRender, x) {
1319
+ const ele = textRender.element;
1320
+ const docRender = ElementUtil.getParentRender(textRender, DocumentRenderObject);
1321
+ if (!docRender) {
1322
+ throw new Error('docRender is null');
1323
+ }
1324
+ const elePaintRenders = ele.paintRenders.filter(item => ElementUtil.getParentRender(item, DocumentRenderObject) === docRender);
1325
+ let count = 0;
1326
+ for (let i = 0; i < elePaintRenders.length; i++) {
1327
+ const render = elePaintRenders[i];
1328
+ if (render !== textRender) {
1329
+ count += render.textMeasures.length;
1330
+ }
1331
+ else {
1332
+ let horX = 0;
1333
+ for (let j = 0; j < render.textMeasures.length; j++) {
1334
+ if (horX + render.textMeasures[j].actualSize >= x) {
1335
+ if (horX + Math.floor(render.textMeasures[j].actualSize / 2) > x) {
1336
+ if (j === 0 && i > 0) {
1337
+ j += 0.5;
1338
+ }
1339
+ }
1340
+ else {
1341
+ j += 1;
1342
+ }
1343
+ return j + count;
1344
+ }
1345
+ horX += render.textMeasures[j].actualSize;
1346
+ }
1347
+ return count + render.textMeasures.length;
1348
+ }
1349
+ }
1350
+ throw new Error('未找到当前文本元素的光标偏移量');
1351
+ }
1352
+ static getHitRenderOffset(render, x) {
1353
+ if (render instanceof TextGroupRenderObject) {
1354
+ return this.getTextRenderOffset(render, x);
1355
+ }
1356
+ else {
1357
+ if (render.element && render.element.type === 'psym') {
1358
+ return 0;
1359
+ }
1360
+ return (render.rect.width / 2) >= x ? 0 : 1;
1361
+ }
1362
+ }
1363
+ static getTextRenderHorX(currRender, startOffset, endOffset) {
1364
+ const textEle = currRender.element;
1365
+ let endX = 0;
1366
+ let startX = 0;
1367
+ let count = 0;
1368
+ for (let i = 0; i < textEle.paintRenders.length; i++) {
1369
+ const paintRender = textEle.paintRenders[i];
1370
+ if (paintRender !== currRender) {
1371
+ count += paintRender.textMeasures.length;
1372
+ }
1373
+ else {
1374
+ if (count + paintRender.textMeasures.length < startOffset) {
1375
+ continue;
1376
+ }
1377
+ if (count > endOffset) {
1378
+ continue;
1379
+ }
1380
+ for (let j = 0; j < paintRender.textMeasures.length; j++) {
1381
+ if (endOffset === count + j) {
1382
+ break;
1383
+ }
1384
+ if (count + j === startOffset) {
1385
+ startX = endX;
1386
+ }
1387
+ endX += paintRender.textMeasures[j].actualSize;
1388
+ }
1389
+ }
1390
+ }
1391
+ return { startX, endX };
1392
+ }
1393
+ /**
1394
+ * 获取一个元素结尾偏移量
1395
+ * 文本以字符长度进行确定
1396
+ * @param ele
1397
+ * @returns
1398
+ */
1399
+ static getElementEndOffset(ele) {
1400
+ if (ele instanceof TextGroupElement) {
1401
+ return ele.textMeasures.length;
1402
+ }
1403
+ return 1;
1404
+ }
1405
+ /**
1406
+ * 判断当前偏移量是否是最终偏移量
1407
+ * @param ele
1408
+ * @param offset
1409
+ */
1410
+ static isElementEndOffset(ele, offset) {
1411
+ return this.getElementEndOffset(ele) === offset;
1412
+ }
1413
+ /**
1414
+ * 获取直接子节点的所有渲染元素
1415
+ * @param ele
1416
+ * @returns
1417
+ */
1418
+ static getChildRenders(ele) {
1419
+ const items = [];
1420
+ for (let i = 0; i < ele.length; i++) {
1421
+ items.push(ele.getChild(i));
1422
+ }
1423
+ return items;
1424
+ }
1425
+ /**
1426
+ * 获取当前单元格内所有的段落行
1427
+ * @param cell
1428
+ * @returns
1429
+ */
1430
+ static getCellParaLines(cell) {
1431
+ const items = [];
1432
+ for (let i = 0; i < cell.length; i++) {
1433
+ const para = cell.getChild(i);
1434
+ for (let j = 0; j < para.length; j++) {
1435
+ items.push(para.getChild(j));
1436
+ }
1437
+ }
1438
+ return items;
1439
+ }
1440
+ static getRandomColor(seed) {
1441
+ let letters = '0123456789ABCDEF';
1442
+ let color = '#';
1443
+ for (let i = 0; i < 6; i++) {
1444
+ color += letters[Math.floor(this.getSeedRandom(seed) * 16)];
1445
+ }
1446
+ return color;
1447
+ }
1448
+ static getSeedRandom(seed) {
1449
+ return Number("0." + Math.sin(seed * Math.random()).toString().substr(6));
1450
+ }
1451
+ static findChildRender(render, predicate) {
1452
+ for (let i = 0; i < render.length; i++) {
1453
+ if (predicate(render.getChild(i))) {
1454
+ return render.getChild(i);
1455
+ }
1456
+ }
1457
+ return null;
1458
+ }
1459
+ static getDataElement(ele) {
1460
+ return this.getParent(ele, item => item instanceof DataElementInlineGroup);
1461
+ }
1462
+ }
1463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC11dGlsLmpzIiwic291cmNlUm9vdCI6ImxpYi8iLCJzb3VyY2VzIjpbImZyYW1ld29yay9lbGVtZW50LXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxPQUFPLEVBRUgsYUFBYSxFQUViLFdBQVcsRUFFWCxJQUFJLEVBR1AsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQW9CLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFDdkYsT0FBTyxFQUFnQixpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFFLE9BQU8sRUFBbUIsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLDRCQUE0QixDQUFDO0FBQy9FLE9BQU8s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LENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUUvQyxNQUFNLEVBQUUsR0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWhELE1BQU0sRUFBRSxHQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFL0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNyQzthQUFNLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMs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