@hailin-zheng/editor-core 1.0.14 → 1.0.20

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 (290) hide show
  1. package/lib/doc-ruler.d.ts +1 -0
  2. package/lib/doc-ruler.d.ts.map +1 -0
  3. package/lib/framework/common-util.d.ts +1 -0
  4. package/lib/framework/common-util.d.ts.map +1 -0
  5. package/lib/framework/document-change.d.ts +1 -0
  6. package/lib/framework/document-change.d.ts.map +1 -0
  7. package/lib/framework/document-combine.d.ts +1 -0
  8. package/lib/framework/document-combine.d.ts.map +1 -0
  9. package/lib/framework/document-comment.d.ts +1 -0
  10. package/lib/framework/document-comment.d.ts.map +1 -0
  11. package/lib/framework/document-context.d.ts +1 -0
  12. package/lib/framework/document-context.d.ts.map +1 -0
  13. package/lib/framework/document-eval-func.d.ts +1 -0
  14. package/lib/framework/document-eval-func.d.ts.map +1 -0
  15. package/lib/framework/document-event.d.ts +1 -0
  16. package/lib/framework/document-event.d.ts.map +1 -0
  17. package/lib/framework/document-history.d.ts +1 -0
  18. package/lib/framework/document-history.d.ts.map +1 -0
  19. package/lib/framework/document-images-loader.d.ts +1 -0
  20. package/lib/framework/document-images-loader.d.ts.map +1 -0
  21. package/lib/framework/document-input-cursor.d.ts +1 -0
  22. package/lib/framework/document-input-cursor.d.ts.map +1 -0
  23. package/lib/framework/document-paint.d.ts +1 -0
  24. package/lib/framework/document-paint.d.ts.map +1 -0
  25. package/lib/framework/document-print-offscreen.d.ts +1 -0
  26. package/lib/framework/document-print-offscreen.d.ts.map +1 -0
  27. package/lib/framework/document-print.d.ts +1 -0
  28. package/lib/framework/document-print.d.ts.map +1 -0
  29. package/lib/framework/document-segmenter.d.ts +1 -0
  30. package/lib/framework/document-segmenter.d.ts.map +1 -0
  31. package/lib/framework/document-selection.d.ts +1 -0
  32. package/lib/framework/document-selection.d.ts.map +1 -0
  33. package/lib/framework/document-template.d.ts +1 -0
  34. package/lib/framework/document-template.d.ts.map +1 -0
  35. package/lib/framework/document-textline-mode.d.ts +1 -0
  36. package/lib/framework/document-textline-mode.d.ts.map +1 -0
  37. package/lib/framework/element-define.d.ts +1 -0
  38. package/lib/framework/element-define.d.ts.map +1 -0
  39. package/lib/framework/element-event-define.d.ts +1 -0
  40. package/lib/framework/element-event-define.d.ts.map +1 -0
  41. package/lib/framework/element-measure.d.ts +1 -0
  42. package/lib/framework/element-measure.d.ts.map +1 -0
  43. package/lib/framework/element-paint.d.ts +1 -0
  44. package/lib/framework/element-paint.d.ts.map +1 -0
  45. package/lib/framework/element-props.d.ts +2 -1
  46. package/lib/framework/element-props.d.ts.map +1 -0
  47. package/lib/framework/element-reader.d.ts +1 -0
  48. package/lib/framework/element-reader.d.ts.map +1 -0
  49. package/lib/framework/element-render-cut.d.ts +1 -0
  50. package/lib/framework/element-render-cut.d.ts.map +1 -0
  51. package/lib/framework/element-serialize.d.ts +1 -0
  52. package/lib/framework/element-serialize.d.ts.map +1 -0
  53. package/lib/framework/element-util.d.ts +1 -0
  54. package/lib/framework/element-util.d.ts.map +1 -0
  55. package/lib/framework/impl/checkbox/checkbox-impl.d.ts +1 -0
  56. package/lib/framework/impl/checkbox/checkbox-impl.d.ts.map +1 -0
  57. package/lib/framework/impl/comments/comment-content-impl.d.ts +1 -0
  58. package/lib/framework/impl/comments/comment-content-impl.d.ts.map +1 -0
  59. package/lib/framework/impl/comments/comment-element-impl.d.ts +1 -0
  60. package/lib/framework/impl/comments/comment-element-impl.d.ts.map +1 -0
  61. package/lib/framework/impl/comments/comments-container-impl.d.ts +1 -0
  62. package/lib/framework/impl/comments/comments-container-impl.d.ts.map +1 -0
  63. package/lib/framework/impl/comments/comments-util.d.ts +1 -0
  64. package/lib/framework/impl/comments/comments-util.d.ts.map +1 -0
  65. package/lib/framework/impl/comments/validate-msg-impl.d.ts +1 -0
  66. package/lib/framework/impl/comments/validate-msg-impl.d.ts.map +1 -0
  67. package/lib/framework/impl/data-element/data-decorate-impl.d.ts +1 -0
  68. package/lib/framework/impl/data-element/data-decorate-impl.d.ts.map +1 -0
  69. package/lib/framework/impl/data-element/data-element-barcode.d.ts +1 -0
  70. package/lib/framework/impl/data-element/data-element-barcode.d.ts.map +1 -0
  71. package/lib/framework/impl/data-element/data-element-base-impl.d.ts +1 -0
  72. package/lib/framework/impl/data-element/data-element-base-impl.d.ts.map +1 -0
  73. package/lib/framework/impl/data-element/data-element-check-impl.d.ts +1 -0
  74. package/lib/framework/impl/data-element/data-element-check-impl.d.ts.map +1 -0
  75. package/lib/framework/impl/data-element/data-element-date-impl.d.ts +1 -0
  76. package/lib/framework/impl/data-element/data-element-date-impl.d.ts.map +1 -0
  77. package/lib/framework/impl/data-element/data-element-group-impl.d.ts +1 -0
  78. package/lib/framework/impl/data-element/data-element-group-impl.d.ts.map +1 -0
  79. package/lib/framework/impl/data-element/data-element-image-impl.d.ts +1 -0
  80. package/lib/framework/impl/data-element/data-element-image-impl.d.ts.map +1 -0
  81. package/lib/framework/impl/data-element/data-element-list-impl.d.ts +1 -0
  82. package/lib/framework/impl/data-element/data-element-list-impl.d.ts.map +1 -0
  83. package/lib/framework/impl/data-element/data-element-text-impl.d.ts +1 -0
  84. package/lib/framework/impl/data-element/data-element-text-impl.d.ts.map +1 -0
  85. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts +1 -0
  86. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts.map +1 -0
  87. package/lib/framework/impl/document/doc-body-impl.d.ts +1 -0
  88. package/lib/framework/impl/document/doc-body-impl.d.ts.map +1 -0
  89. package/lib/framework/impl/document/doc-body-part-impl.d.ts +1 -0
  90. package/lib/framework/impl/document/doc-body-part-impl.d.ts.map +1 -0
  91. package/lib/framework/impl/document/doc-container-impl.d.ts +1 -0
  92. package/lib/framework/impl/document/doc-container-impl.d.ts.map +1 -0
  93. package/lib/framework/impl/document/doc-footer-impl.d.ts +1 -0
  94. package/lib/framework/impl/document/doc-footer-impl.d.ts.map +1 -0
  95. package/lib/framework/impl/document/doc-header-impl.d.ts +1 -0
  96. package/lib/framework/impl/document/doc-header-impl.d.ts.map +1 -0
  97. package/lib/framework/impl/document/doc-impl.d.ts +1 -0
  98. package/lib/framework/impl/document/doc-impl.d.ts.map +1 -0
  99. package/lib/framework/impl/index.d.ts +37 -0
  100. package/lib/framework/impl/index.d.ts.map +1 -0
  101. package/lib/framework/impl/media-formula/menstrual-history.d.ts +1 -0
  102. package/lib/framework/impl/media-formula/menstrual-history.d.ts.map +1 -0
  103. package/lib/framework/impl/paragraph/p-impl.d.ts +1 -0
  104. package/lib/framework/impl/paragraph/p-impl.d.ts.map +1 -0
  105. package/lib/framework/impl/picture/image-impl.d.ts +1 -0
  106. package/lib/framework/impl/picture/image-impl.d.ts.map +1 -0
  107. package/lib/framework/impl/radio/radio-impl.d.ts +1 -0
  108. package/lib/framework/impl/radio/radio-impl.d.ts.map +1 -0
  109. package/lib/framework/impl/symbol/br-symbol-impl.d.ts +1 -0
  110. package/lib/framework/impl/symbol/br-symbol-impl.d.ts.map +1 -0
  111. package/lib/framework/impl/symbol/p-symbol-impl.d.ts +1 -0
  112. package/lib/framework/impl/symbol/p-symbol-impl.d.ts.map +1 -0
  113. package/lib/framework/impl/table/table-cell-impl.d.ts +1 -0
  114. package/lib/framework/impl/table/table-cell-impl.d.ts.map +1 -0
  115. package/lib/framework/impl/table/table-impl.d.ts +1 -0
  116. package/lib/framework/impl/table/table-impl.d.ts.map +1 -0
  117. package/lib/framework/impl/table/table-row-impl.d.ts +1 -0
  118. package/lib/framework/impl/table/table-row-impl.d.ts.map +1 -0
  119. package/lib/framework/impl/table/table-split-cell-patch.d.ts +1 -0
  120. package/lib/framework/impl/table/table-split-cell-patch.d.ts.map +1 -0
  121. package/lib/framework/impl/table/table-split-cell.d.ts +1 -0
  122. package/lib/framework/impl/table/table-split-cell.d.ts.map +1 -0
  123. package/lib/framework/impl/table/table-util.d.ts +1 -0
  124. package/lib/framework/impl/table/table-util.d.ts.map +1 -0
  125. package/lib/framework/impl/text/text-impl.d.ts +1 -0
  126. package/lib/framework/impl/text/text-impl.d.ts.map +1 -0
  127. package/lib/framework/impl/text/track-run-impl.d.ts +1 -0
  128. package/lib/framework/impl/text/track-run-impl.d.ts.map +1 -0
  129. package/lib/framework/notify.d.ts +1 -0
  130. package/lib/framework/notify.d.ts.map +1 -0
  131. package/lib/framework/range-util.d.ts +1 -0
  132. package/lib/framework/range-util.d.ts.map +1 -0
  133. package/lib/framework/render-context.d.ts +1 -0
  134. package/lib/framework/render-context.d.ts.map +1 -0
  135. package/lib/framework/render-define.d.ts +1 -0
  136. package/lib/framework/render-define.d.ts.map +1 -0
  137. package/lib/framework/selection-overlays.d.ts +1 -0
  138. package/lib/framework/selection-overlays.d.ts.map +1 -0
  139. package/lib/index.d.ts +35 -0
  140. package/lib/index.d.ts.map +1 -0
  141. package/lib/index.js +15671 -0
  142. package/lib/texteditor.d.ts +3 -2
  143. package/lib/texteditor.d.ts.map +1 -0
  144. package/lib/util/subject.d.ts +1 -0
  145. package/lib/util/subject.d.ts.map +1 -0
  146. package/lib/util/table-bind.d.ts +1 -0
  147. package/lib/util/table-bind.d.ts.map +1 -0
  148. package/package.json +14 -8
  149. package/lib/doc-ruler.js +0 -313
  150. package/lib/doc-ruler.js.map +0 -1
  151. package/lib/framework/common-util.js +0 -178
  152. package/lib/framework/common-util.js.map +0 -1
  153. package/lib/framework/document-change.js +0 -1342
  154. package/lib/framework/document-change.js.map +0 -1
  155. package/lib/framework/document-combine.js +0 -40
  156. package/lib/framework/document-combine.js.map +0 -1
  157. package/lib/framework/document-comment.js +0 -148
  158. package/lib/framework/document-comment.js.map +0 -1
  159. package/lib/framework/document-context.js +0 -330
  160. package/lib/framework/document-context.js.map +0 -1
  161. package/lib/framework/document-eval-func.js +0 -48
  162. package/lib/framework/document-eval-func.js.map +0 -1
  163. package/lib/framework/document-event.js +0 -1054
  164. package/lib/framework/document-event.js.map +0 -1
  165. package/lib/framework/document-history.js +0 -65
  166. package/lib/framework/document-history.js.map +0 -1
  167. package/lib/framework/document-images-loader.js +0 -66
  168. package/lib/framework/document-images-loader.js.map +0 -1
  169. package/lib/framework/document-input-cursor.js +0 -239
  170. package/lib/framework/document-input-cursor.js.map +0 -1
  171. package/lib/framework/document-paint.js +0 -103
  172. package/lib/framework/document-paint.js.map +0 -1
  173. package/lib/framework/document-print-offscreen.js +0 -128
  174. package/lib/framework/document-print-offscreen.js.map +0 -1
  175. package/lib/framework/document-print.js +0 -203
  176. package/lib/framework/document-print.js.map +0 -1
  177. package/lib/framework/document-segmenter.js +0 -106
  178. package/lib/framework/document-segmenter.js.map +0 -1
  179. package/lib/framework/document-selection.js +0 -358
  180. package/lib/framework/document-selection.js.map +0 -1
  181. package/lib/framework/document-template.js +0 -20
  182. package/lib/framework/document-template.js.map +0 -1
  183. package/lib/framework/document-textline-mode.js +0 -30
  184. package/lib/framework/document-textline-mode.js.map +0 -1
  185. package/lib/framework/element-define.js +0 -579
  186. package/lib/framework/element-define.js.map +0 -1
  187. package/lib/framework/element-event-define.js +0 -108
  188. package/lib/framework/element-event-define.js.map +0 -1
  189. package/lib/framework/element-measure.js +0 -551
  190. package/lib/framework/element-measure.js.map +0 -1
  191. package/lib/framework/element-paint.js +0 -170
  192. package/lib/framework/element-paint.js.map +0 -1
  193. package/lib/framework/element-props.js +0 -809
  194. package/lib/framework/element-props.js.map +0 -1
  195. package/lib/framework/element-reader.js +0 -151
  196. package/lib/framework/element-reader.js.map +0 -1
  197. package/lib/framework/element-render-cut.js +0 -449
  198. package/lib/framework/element-render-cut.js.map +0 -1
  199. package/lib/framework/element-serialize.js +0 -113
  200. package/lib/framework/element-serialize.js.map +0 -1
  201. package/lib/framework/element-util.js +0 -1463
  202. package/lib/framework/element-util.js.map +0 -1
  203. package/lib/framework/impl/checkbox/checkbox-impl.js +0 -64
  204. package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  205. package/lib/framework/impl/comments/comment-content-impl.js +0 -105
  206. package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
  207. package/lib/framework/impl/comments/comment-element-impl.js +0 -62
  208. package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
  209. package/lib/framework/impl/comments/comments-container-impl.js +0 -62
  210. package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
  211. package/lib/framework/impl/comments/comments-util.js +0 -67
  212. package/lib/framework/impl/comments/comments-util.js.map +0 -1
  213. package/lib/framework/impl/comments/validate-msg-impl.js +0 -83
  214. package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
  215. package/lib/framework/impl/data-element/data-decorate-impl.js +0 -91
  216. package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  217. package/lib/framework/impl/data-element/data-element-barcode.js +0 -115
  218. package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
  219. package/lib/framework/impl/data-element/data-element-base-impl.js +0 -205
  220. package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  221. package/lib/framework/impl/data-element/data-element-check-impl.js +0 -133
  222. package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  223. package/lib/framework/impl/data-element/data-element-date-impl.js +0 -111
  224. package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  225. package/lib/framework/impl/data-element/data-element-group-impl.js +0 -130
  226. package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  227. package/lib/framework/impl/data-element/data-element-image-impl.js +0 -137
  228. package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  229. package/lib/framework/impl/data-element/data-element-list-impl.js +0 -131
  230. package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  231. package/lib/framework/impl/data-element/data-element-text-impl.js +0 -103
  232. package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  233. package/lib/framework/impl/decorate/fill-null-space-imple.js +0 -43
  234. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  235. package/lib/framework/impl/document/doc-body-impl.js +0 -79
  236. package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
  237. package/lib/framework/impl/document/doc-body-part-impl.js +0 -94
  238. package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
  239. package/lib/framework/impl/document/doc-container-impl.js +0 -21
  240. package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
  241. package/lib/framework/impl/document/doc-footer-impl.js +0 -77
  242. package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
  243. package/lib/framework/impl/document/doc-header-impl.js +0 -83
  244. package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
  245. package/lib/framework/impl/document/doc-impl.js +0 -209
  246. package/lib/framework/impl/document/doc-impl.js.map +0 -1
  247. package/lib/framework/impl/media-formula/menstrual-history.js +0 -153
  248. package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
  249. package/lib/framework/impl/paragraph/p-impl.js +0 -156
  250. package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
  251. package/lib/framework/impl/picture/image-impl.js +0 -124
  252. package/lib/framework/impl/picture/image-impl.js.map +0 -1
  253. package/lib/framework/impl/radio/radio-impl.js +0 -72
  254. package/lib/framework/impl/radio/radio-impl.js.map +0 -1
  255. package/lib/framework/impl/symbol/br-symbol-impl.js +0 -54
  256. package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  257. package/lib/framework/impl/symbol/p-symbol-impl.js +0 -54
  258. package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  259. package/lib/framework/impl/table/table-cell-impl.js +0 -145
  260. package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
  261. package/lib/framework/impl/table/table-impl.js +0 -363
  262. package/lib/framework/impl/table/table-impl.js.map +0 -1
  263. package/lib/framework/impl/table/table-row-impl.js +0 -75
  264. package/lib/framework/impl/table/table-row-impl.js.map +0 -1
  265. package/lib/framework/impl/table/table-split-cell-patch.js +0 -89
  266. package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
  267. package/lib/framework/impl/table/table-split-cell.js +0 -464
  268. package/lib/framework/impl/table/table-split-cell.js.map +0 -1
  269. package/lib/framework/impl/table/table-util.js +0 -678
  270. package/lib/framework/impl/table/table-util.js.map +0 -1
  271. package/lib/framework/impl/text/text-impl.js +0 -149
  272. package/lib/framework/impl/text/text-impl.js.map +0 -1
  273. package/lib/framework/impl/text/track-run-impl.js +0 -112
  274. package/lib/framework/impl/text/track-run-impl.js.map +0 -1
  275. package/lib/framework/notify.js +0 -116
  276. package/lib/framework/notify.js.map +0 -1
  277. package/lib/framework/range-util.js +0 -312
  278. package/lib/framework/range-util.js.map +0 -1
  279. package/lib/framework/render-context.js +0 -384
  280. package/lib/framework/render-context.js.map +0 -1
  281. package/lib/framework/render-define.js +0 -195
  282. package/lib/framework/render-define.js.map +0 -1
  283. package/lib/framework/selection-overlays.js +0 -124
  284. package/lib/framework/selection-overlays.js.map +0 -1
  285. package/lib/texteditor.js +0 -913
  286. package/lib/texteditor.js.map +0 -1
  287. package/lib/util/subject.js +0 -88
  288. package/lib/util/subject.js.map +0 -1
  289. package/lib/util/table-bind.js +0 -6
  290. package/lib/util/table-bind.js.map +0 -1
@@ -1,1463 +0,0 @@
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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