@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,1342 @@
1
+ import { SelectionRange } from "./document-selection";
2
+ import { ElementUtil } from "./element-util";
3
+ import { BlockContainerElement, BlockContentElement, BranchElement, DocMode, InlineGroupElement, LeafElement } from "./element-define";
4
+ import { TextGroupElement } from "./impl/text/text-impl";
5
+ import { PSymbolElement } from "./impl/symbol/p-symbol-impl";
6
+ import { ParagraphElement } from "./impl/paragraph/p-impl";
7
+ import { RangeUtil } from "./range-util";
8
+ import { TableElement } from "./impl/table/table-impl";
9
+ import { DocumentEvent } from "./document-event";
10
+ import { KeyboradElementEvent } from "./element-event-define";
11
+ import { ElementSerialize } from "./element-serialize";
12
+ import { BreakElement } from "./impl/symbol/br-symbol-impl";
13
+ import { DataDecorateElement } from "./impl/data-element/data-decorate-impl";
14
+ import { DataElementInlineGroup, InlineGroupInputElement, IsInSideDataElement, IsInSideInlineGroupInputElement } from "./impl/data-element/data-element-base-impl";
15
+ import { CommentElement } from "./impl/comments/comment-element-impl";
16
+ import { nanoid } from "nanoid";
17
+ import { CommContentElement } from "./impl/comments/comment-content-impl";
18
+ import { ValidateElement } from "./impl/comments/validate-msg-impl";
19
+ import { CommonUtil } from "./common-util";
20
+ import { TrackRunElement, TrackRunTypeEnum } from "./impl/text/track-run-impl";
21
+ import { DocumentBodyElement } from "./impl/document/doc-body-impl";
22
+ /**
23
+ * 文档内容改变
24
+ */
25
+ export class DocumentChange {
26
+ selectionState;
27
+ viewOptions;
28
+ eleReader;
29
+ docCtx;
30
+ docComment;
31
+ constructor(selectionState, viewOptions, eleReader, docCtx, docComment) {
32
+ this.selectionState = selectionState;
33
+ this.viewOptions = viewOptions;
34
+ this.eleReader = eleReader;
35
+ this.docCtx = docCtx;
36
+ this.docComment = docComment;
37
+ }
38
+ newInput(data) {
39
+ const { startControl, startOffset, collapsed, enableTrackChanges } = this.selectionState;
40
+ if (!collapsed) {
41
+ this.onInputBySelection(data);
42
+ return;
43
+ }
44
+ //判断是否需要创建新的留痕区域
45
+ if (enableTrackChanges && !this.isInCorrectTrackRegion(startControl, TrackRunTypeEnum.Inserted)) {
46
+ this.newInputTrackChanges(data, startControl, startOffset);
47
+ return;
48
+ }
49
+ //当前输入节点是在留痕区域中,但是当前关闭了审阅模式,需要拆分留痕区域,创建新输入节点
50
+ if (!enableTrackChanges && this.isInTrackBlock(startControl)) {
51
+ const newInput = this.splitTrackElement(startControl, startOffset);
52
+ const comp = data.compositionStartInfo;
53
+ comp.element = newInput;
54
+ comp.offset = 0;
55
+ this.inputTextGroup(newInput, data);
56
+ return;
57
+ }
58
+ if (!(startControl instanceof TextGroupElement)) {
59
+ if (!data.compositionStartInfo) {
60
+ throw new Error('compositionStartInfo is null');
61
+ }
62
+ const siblingTextEle = startOffset === 1 ? ElementUtil.getNextSiblingElement(startControl) : ElementUtil.getPrevSiblingElement(startControl);
63
+ if (siblingTextEle instanceof TextGroupElement) {
64
+ data.compositionStartInfo.offset = startOffset === 0 ? siblingTextEle.text.length : 0;
65
+ this.inputTextGroup(siblingTextEle, data);
66
+ }
67
+ else {
68
+ const inputTextProps = this.getDefaultTextProps(startControl, startOffset);
69
+ const newTextGroup = ElementUtil.getNewTextGroup(inputTextProps);
70
+ startControl.parent.addChild(newTextGroup, startControl.getIndex() + startOffset);
71
+ this.inputTextGroup(newTextGroup, data);
72
+ }
73
+ return;
74
+ }
75
+ this.inputTextGroup(startControl, data);
76
+ }
77
+ /**
78
+ * 选中区域后进行输入
79
+ * 需要处理将选中的区域删除后,进行输入的情况
80
+ */
81
+ onInputBySelection(data) {
82
+ this.onRangeDelete();
83
+ this.selectionState.afterSelectionChanged = (newVal) => {
84
+ const { startControl, startOffset, editable } = newVal;
85
+ if (!editable) {
86
+ return false;
87
+ }
88
+ const comp = data.compositionStartInfo;
89
+ comp.element = startControl;
90
+ comp.offset = startOffset;
91
+ this.newInput(data);
92
+ return true;
93
+ };
94
+ }
95
+ /**
96
+ * 当前元素是否在正确的留痕区域(ins-run、del-run),情况分为以下情况
97
+ * 1.留痕块类型为新增,但是留痕块的创建者为其他用户,此时需要拆分留痕区域
98
+ * 2.留痕块为当前用户创建,但是创建时间大于有效的时间,此时需要拆分留痕区域
99
+ * @param startControl
100
+ * @param trackType
101
+ * @returns
102
+ */
103
+ isInCorrectTrackRegion(startControl, trackType) {
104
+ const parent = startControl.parent;
105
+ return parent instanceof TrackRunElement
106
+ && parent.props.userId === this.viewOptions.editUser.id
107
+ && parent.type === trackType
108
+ && CommonUtil.getNowDiffSeconds(parent.props.date) <= this.viewOptions.trackChangePeriod;
109
+ }
110
+ /**
111
+ * 当前元素是否在留痕区域(ins-run、del-run)中
112
+ * @param target
113
+ * @param trackType
114
+ * @returns
115
+ */
116
+ isInTrackBlock(target, trackType = null) {
117
+ return target.parent instanceof TrackRunElement && (trackType === null || target.parent.type === trackType);
118
+ }
119
+ /**
120
+ * 留痕输入
121
+ * @param data
122
+ * @param startControl
123
+ * @param startOffset
124
+ * @returns
125
+ */
126
+ newInputTrackChanges(data, startControl, startOffset) {
127
+ const userId = this.viewOptions.editUser.id;
128
+ const compInfo = data.compositionStartInfo;
129
+ if (this.isInCorrectTrackRegion(startControl, TrackRunTypeEnum.Inserted)) {
130
+ return;
131
+ }
132
+ if (this.isInTrackBlock(startControl)) {
133
+ const newInput = this.createNewTrackInput(startControl, startOffset, TrackRunTypeEnum.Inserted);
134
+ compInfo.offset = 0;
135
+ compInfo.element = newInput;
136
+ this.inputTextGroup(newInput, data);
137
+ return;
138
+ }
139
+ else {
140
+ const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, null, TrackRunTypeEnum.Inserted);
141
+ this.insertElement(startControl, startOffset, [trackElement]);
142
+ compInfo.offset = 0;
143
+ compInfo.element = newTextGroup;
144
+ this.inputTextGroup(newTextGroup, data);
145
+ return;
146
+ }
147
+ }
148
+ /**
149
+ * 创建新的留痕块,并返回留痕块输入定位文本
150
+ * @param startControl
151
+ * @param startOffset
152
+ * @param trackType
153
+ * @returns
154
+ */
155
+ createNewTrackInput(startControl, startOffset, trackType) {
156
+ const textProps = this.getDefaultTextProps(startControl, startOffset);
157
+ const currTrackEle = startControl.parent;
158
+ if (startControl instanceof TextGroupElement && startOffset > 0 && startOffset < startControl.textMeasures.length) {
159
+ const splitText = startControl.spliceText(startOffset, startControl.textMeasures.length, true);
160
+ startControl.parent.addChild(splitText, startControl.getIndex() + 1);
161
+ startOffset = startControl.textMeasures.length;
162
+ }
163
+ startOffset = startOffset > 0 ? 1 : 0;
164
+ const index = startControl.getIndex() + startOffset;
165
+ //切割留痕块
166
+ if (index > 0 && index < currTrackEle.length) {
167
+ const splitTrack = currTrackEle.split(startControl.getIndex() + startOffset);
168
+ currTrackEle.parent.addChild(splitTrack, currTrackEle.getIndex() + 1);
169
+ const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, textProps, trackType);
170
+ currTrackEle.parent.addChild(trackElement, currTrackEle.getIndex() + 1);
171
+ return newTextGroup;
172
+ }
173
+ else {
174
+ const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, textProps, trackType);
175
+ currTrackEle.parent.addChild(trackElement, currTrackEle.getIndex() + (index === 0 ? 0 : 1));
176
+ return newTextGroup;
177
+ }
178
+ }
179
+ /**
180
+ * 获取当前输入节点的文本属性
181
+ * @param startControl
182
+ * @returns
183
+ */
184
+ getDefaultTextProps(startControl, offset) {
185
+ const para = ElementUtil.getParentByType(startControl, ParagraphElement);
186
+ let textProps = para.props.textProps;
187
+ if (startControl instanceof TextGroupElement) {
188
+ textProps = startControl.props;
189
+ }
190
+ const dataEle = ElementUtil.getDataElement(startControl);
191
+ if (dataEle && IsInSideDataElement(startControl, offset)) {
192
+ return dataEle.props.valueTextProps;
193
+ }
194
+ return textProps;
195
+ }
196
+ /**
197
+ * 当前元素位于留痕区域内,但是当前编辑模式为非留痕模式,需要将当前留痕元素分割开来,插入新普通文本元素对象,并返回
198
+ * @param startControl
199
+ * @param startOffset
200
+ * @returns
201
+ */
202
+ splitTrackElement(startControl, startOffset) {
203
+ if (!(startControl.parent instanceof TrackRunElement) && startControl instanceof TextGroupElement) {
204
+ return startControl;
205
+ }
206
+ const textProps = this.getDefaultTextProps(startControl, startOffset);
207
+ const currTrackEle = startControl.parent;
208
+ if (startControl instanceof TextGroupElement && startOffset > 0 && startOffset < startControl.textMeasures.length) {
209
+ const splitText = startControl.spliceText(startOffset, startControl.textMeasures.length, true);
210
+ startControl.parent.addChild(splitText, startControl.getIndex() + 1);
211
+ startOffset = startControl.textMeasures.length;
212
+ }
213
+ startOffset = startOffset > 0 ? 1 : 0;
214
+ const index = startControl.getIndex() + startOffset;
215
+ if (index > 0 && index < currTrackEle.length) {
216
+ const splitTrack = currTrackEle.split(startControl.getIndex() + startOffset);
217
+ currTrackEle.parent.addChild(splitTrack, currTrackEle.getIndex() + 1);
218
+ const newInput = ElementUtil.getNewTextGroup(textProps);
219
+ currTrackEle.parent.addChild(newInput, currTrackEle.getIndex() + 1);
220
+ return this.splitTrackElement(newInput, 0);
221
+ }
222
+ else {
223
+ const newInput = ElementUtil.getNewTextGroup(textProps);
224
+ currTrackEle.parent.addChild(newInput, currTrackEle.getIndex() + (index === 0 ? 0 : 1));
225
+ return this.splitTrackElement(newInput, 0);
226
+ }
227
+ }
228
+ /**
229
+ * 创建插入(ins-run) 留痕,并且返回留痕的文本元素对象
230
+ * @param startControl
231
+ * @returns
232
+ */
233
+ createTextTrackElement(startControl, textProps, trackType) {
234
+ const para = ElementUtil.getParentByType(startControl, ParagraphElement);
235
+ const trackElement = this.createTrackElement(trackType);
236
+ textProps = textProps || para.props.textProps;
237
+ const newTextGroup = ElementUtil.getNewTextGroup(textProps);
238
+ newTextGroup.props.color = '#ff4d4f';
239
+ trackElement.addChild(newTextGroup);
240
+ return {
241
+ trackElement,
242
+ newTextGroup
243
+ };
244
+ }
245
+ createTrackElement(trackType) {
246
+ const trackElement = new TrackRunElement(trackType);
247
+ trackElement.props.userId = this.viewOptions.editUser.id;
248
+ trackElement.props.userName = this.viewOptions.editUser.name;
249
+ trackElement.props.date = CommonUtil.formatNow('YYYY-MM-DD HH:mm:ss');
250
+ trackElement.props.id = nanoid(5);
251
+ return trackElement;
252
+ }
253
+ inputTextGroup(text, data) {
254
+ const prevInputData = data.prevInputData || '';
255
+ const prevInputDataLength = prevInputData.length;
256
+ if (!data.compositionStartInfo) {
257
+ throw new Error('compositionStartInfo is null');
258
+ }
259
+ const { element, offset } = data.compositionStartInfo;
260
+ let startInputOffset = offset;
261
+ //startInputOffset -= prevInputDataLength;
262
+ if (!(element instanceof TextGroupElement)) {
263
+ //当前选中元素位于输入元素是起始还是结束位置,如果位于起始位置,则输入偏移量为0,否则为未变更之前的内容length
264
+ if (ElementUtil.getNextSiblingElement(element) === text) {
265
+ startInputOffset = 0;
266
+ }
267
+ else {
268
+ startInputOffset = text.textMeasures.length - prevInputDataLength;
269
+ }
270
+ }
271
+ text.splice(startInputOffset, prevInputDataLength, data.data);
272
+ //输入后撤销,导致文本组内为空
273
+ if (!text.text.length) {
274
+ this.removeEmptyText(text);
275
+ }
276
+ else {
277
+ this.selectionState.resetRange(text, startInputOffset + data.data.length);
278
+ }
279
+ }
280
+ /**
281
+ * backspace,向前删除
282
+ */
283
+ onBackspace(evt) {
284
+ const { startControl, startOffset, collapsed } = this.selectionState;
285
+ if (!startControl) {
286
+ throw new Error('startControl is null');
287
+ }
288
+ const eventElement = new KeyboradElementEvent(this.docCtx);
289
+ eventElement.key = 'backspace';
290
+ eventElement.source = startControl;
291
+ eventElement.sourceEvent = evt;
292
+ eventElement.sourceOffset = startOffset;
293
+ const res = DocumentEvent.invokeEvent('BackspaceKey', startControl, eventElement, 'Capture', this.docCtx);
294
+ if (res && res.isCancel) {
295
+ return;
296
+ }
297
+ this.docComment.updateComments();
298
+ if (collapsed) {
299
+ this.onBackspaceElement(startControl, startOffset);
300
+ }
301
+ else {
302
+ this.onRangeDelete();
303
+ }
304
+ }
305
+ /**
306
+ * delete,向后删除
307
+ * @param evt
308
+ */
309
+ onDeleteKeyHandler(evt) {
310
+ const { startControl, startOffset, collapsed } = this.selectionState;
311
+ const eventElement = new KeyboradElementEvent(this.docCtx);
312
+ eventElement.key = 'delete';
313
+ eventElement.source = startControl;
314
+ eventElement.sourceEvent = evt;
315
+ eventElement.sourceOffset = startOffset;
316
+ const res = DocumentEvent.invokeEvent('DeleteKey', startControl, eventElement, 'Capture', this.docCtx);
317
+ if (res && res.isCancel) {
318
+ return;
319
+ }
320
+ if (collapsed) {
321
+ this.onKeyDeleteElement(startControl, startOffset);
322
+ }
323
+ else {
324
+ this.onRangeDelete();
325
+ }
326
+ }
327
+ /**
328
+ * 根据选择范围删除
329
+ */
330
+ onRangeDelete() {
331
+ const { selectedRange } = this.selectionState;
332
+ if (!selectedRange) {
333
+ throw new Error('selectionRange is null');
334
+ }
335
+ //用于刷新后定位光标
336
+ let startPointElement;
337
+ let startPointOffset = 0;
338
+ if (selectedRange.isFullSelected) {
339
+ //某个容器的内容被全部选中
340
+ if (selectedRange.target instanceof BlockContainerElement) {
341
+ startPointElement = selectedRange.target;
342
+ startPointOffset = 0;
343
+ }
344
+ //内容块被选中,需要向上寻找内容块容器
345
+ else if (selectedRange.target instanceof BlockContentElement) {
346
+ const parentContainer = ElementUtil.getParent(selectedRange.target, (item) => item instanceof BlockContainerElement);
347
+ if (parentContainer) {
348
+ startPointElement = parentContainer;
349
+ startPointOffset = 0;
350
+ }
351
+ else {
352
+ throw new Error('未能向上寻找到定位的内容块容器');
353
+ }
354
+ }
355
+ else {
356
+ throw new Error('未知条件区间');
357
+ }
358
+ }
359
+ else {
360
+ const startRange = RangeUtil.getStartRangeTarget(selectedRange);
361
+ const endRange = RangeUtil.getEndRangeTarget(selectedRange);
362
+ if (startRange.isFullSelected) {
363
+ startPointElement = ElementUtil.getRecursionPrevSiblingElement(startRange.target, false, true);
364
+ startPointOffset = -1;
365
+ //判断结束选区和开始选区是否在一个段落中,尽量落在同一段落中
366
+ if (!startPointElement || ElementUtil.isInSameParagraph(startRange.target, endRange.target)) {
367
+ if (!endRange.isFullSelected) {
368
+ startPointElement = endRange.target;
369
+ startPointOffset = 0;
370
+ }
371
+ }
372
+ }
373
+ else {
374
+ startPointElement = startRange.target;
375
+ startPointOffset = startRange.startOffset;
376
+ }
377
+ }
378
+ if (this.viewOptions.docMode === DocMode.FormEdit) {
379
+ this.deleteRangeInFormEdit(selectedRange);
380
+ }
381
+ else {
382
+ this.deleteRange(selectedRange);
383
+ }
384
+ this.selectionState.resetRange(startPointElement, startPointOffset);
385
+ return { cursorEle: startPointElement, cursorOffset: startPointOffset };
386
+ }
387
+ /**
388
+ * backspace删除
389
+ * @param control
390
+ * @param offset
391
+ * @returns
392
+ */
393
+ onBackspaceElement(control, offset) {
394
+ this.selectionState.clear();
395
+ if (offset === 0) {
396
+ const prevEle = ElementUtil.getRecursionPrevSiblingElement(control, false, true);
397
+ if (!prevEle) {
398
+ this.selectionState.resetRange(control, 0);
399
+ return;
400
+ }
401
+ if (ElementUtil.isInSameParagraph(control, prevEle)) {
402
+ if (ElementUtil.getPrevSiblingElement(control) === prevEle) {
403
+ this.onBackspaceElement(prevEle, ElementUtil.getElementEndOffset(prevEle));
404
+ }
405
+ else {
406
+ this.selectionState.resetRange(prevEle, -1);
407
+ }
408
+ }
409
+ else {
410
+ //需要判断是否是兄弟段落,兄弟段落,需要合并
411
+ const prevPara = ElementUtil.getParentByType(prevEle, ParagraphElement);
412
+ const currPara = ElementUtil.getParentByType(control, ParagraphElement);
413
+ //表明是紧挨着的两个段落,要进行段落合并
414
+ if (ElementUtil.getPrevSiblingElement(currPara) === prevPara) {
415
+ if (this.selectionState.enableTrackChanges) {
416
+ this.selectionState.resetRange(prevEle, -1);
417
+ return;
418
+ }
419
+ this.combineParagraph(prevPara, currPara, control);
420
+ }
421
+ else {
422
+ //不是紧挨着的段落,则前一个段落是位于另一个容器里,例如:处于单元格内的段落
423
+ //则不向前定位
424
+ this.selectionState.resetRange(control, offset);
425
+ }
426
+ }
427
+ }
428
+ else {
429
+ if (control instanceof TextGroupElement) {
430
+ this.onDeleteText(control, offset - 1, 1);
431
+ if (!control.textMeasures.length) {
432
+ this.removeEmptyText(control);
433
+ }
434
+ else {
435
+ this.selectionState.resetRange(control, offset - 1);
436
+ }
437
+ }
438
+ else {
439
+ if (control.parent instanceof InlineGroupInputElement && control instanceof DataDecorateElement) {
440
+ const dataEle = control.parent;
441
+ //空数据元,并且当前光标处于数据元开始位置
442
+ if (this.canDeleteInlineGroup(dataEle)) {
443
+ this.setCurosrForDeleteAction(dataEle);
444
+ dataEle.remove();
445
+ return;
446
+ }
447
+ if (control.isPrefix && this.viewOptions.docMode === DocMode.FormEdit) {
448
+ if (this.jumpToPrevDataElement(dataEle)) {
449
+ return;
450
+ }
451
+ }
452
+ }
453
+ if (control.isDecorate) {
454
+ this.onBackspaceElement(control, 0);
455
+ return;
456
+ }
457
+ this.removeElement(control);
458
+ }
459
+ }
460
+ }
461
+ /**
462
+ * 跳到上一个数据元中
463
+ * @param currEle
464
+ */
465
+ jumpToPrevDataElement(currEle) {
466
+ if (this.viewOptions.docMode !== DocMode.FormEdit) {
467
+ return false;
468
+ }
469
+ const prevEle = ElementUtil.getPrevDataElement(this.docCtx, currEle);
470
+ if (!prevEle) {
471
+ return false;
472
+ }
473
+ if (prevEle) {
474
+ this.selectionState.resetRange(prevEle.endDecorate, 0);
475
+ return true;
476
+ }
477
+ return false;
478
+ }
479
+ /**
480
+ * delete删除
481
+ * @param control
482
+ * @param offset
483
+ * @returns
484
+ */
485
+ onKeyDeleteElement(control, offset) {
486
+ this.selectionState.clear();
487
+ if (offset === ElementUtil.getElementEndOffset(control)) {
488
+ const nextEle = ElementUtil.getRecursionNextSiblingElement(control, false, true);
489
+ if (!nextEle) {
490
+ this.selectionState.resetRange(control, -1);
491
+ return;
492
+ }
493
+ if (ElementUtil.isInSameParagraph(control, nextEle)) {
494
+ if (ElementUtil.getNextSiblingElement(control) === nextEle) {
495
+ this.onKeyDeleteElement(nextEle, 0);
496
+ }
497
+ else {
498
+ this.selectionState.resetRange(nextEle, 0);
499
+ }
500
+ }
501
+ else {
502
+ //需要判断是否是兄弟段落,兄弟段落,需要合并
503
+ const nextPara = ElementUtil.getParentByType(nextEle, ParagraphElement);
504
+ const currPara = ElementUtil.getParentByType(control, ParagraphElement);
505
+ //表明是紧挨着的两个段落,要进行段落合并
506
+ if (ElementUtil.getNextSiblingElement(currPara) === nextPara) {
507
+ if (this.selectionState.enableTrackChanges) {
508
+ this.selectionState.resetRange(nextEle, 0);
509
+ return;
510
+ }
511
+ this.combineParagraph(nextPara, currPara, control);
512
+ }
513
+ else {
514
+ //不是紧挨着的段落,则前一个段落是位于另一个容器里,例如:处于单元格内的段落
515
+ //则不向前定位
516
+ this.selectionState.resetRange(control, offset);
517
+ }
518
+ }
519
+ }
520
+ else {
521
+ if (control instanceof TextGroupElement) {
522
+ this.onDeleteText(control, offset, 1);
523
+ if (!control.textMeasures.length) {
524
+ this.removeEmptyText(control);
525
+ }
526
+ else {
527
+ this.selectionState.resetRange(control, offset);
528
+ }
529
+ }
530
+ else {
531
+ if (control.parent instanceof DataElementInlineGroup && control instanceof DataDecorateElement) {
532
+ const dataEle = control.parent;
533
+ //空数据元,并且当前光标处于数据元开始位置
534
+ if (control.isPrefix) {
535
+ if (this.canDeleteInlineGroup(dataEle)) {
536
+ this.setCurosrForDeleteAction(dataEle);
537
+ dataEle.remove();
538
+ }
539
+ else {
540
+ this.selectionState.resetRange(control, -1);
541
+ }
542
+ return;
543
+ }
544
+ else if (!control.isPrefix && dataEle.length === 2) {
545
+ this.selectionState.resetRange(dataEle.endDecorate, -1);
546
+ return;
547
+ }
548
+ }
549
+ if (control.isDecorate) {
550
+ //this.onKeyDeleteElement(control, -1);
551
+ return;
552
+ }
553
+ this.removeElement(control);
554
+ }
555
+ }
556
+ }
557
+ /**
558
+ * 判断是否可以删除数据组
559
+ * @param dataEle
560
+ * @private
561
+ */
562
+ canDeleteInlineGroup(dataEle) {
563
+ if (this.viewOptions.docMode === DocMode.FormEdit) {
564
+ return false;
565
+ }
566
+ return dataEle.length === 2;
567
+ }
568
+ onDeleteText(text, offset, len) {
569
+ if (this.selectionState.enableTrackChanges) {
570
+ this.updateDeletedTrackText(text, offset, len);
571
+ }
572
+ else {
573
+ text.splice(offset, len);
574
+ }
575
+ }
576
+ onDeleteItem(item) {
577
+ if (this.selectionState.enableTrackChanges) {
578
+ //删除符号不进行留痕
579
+ if (item.type === 'psym') {
580
+ return;
581
+ }
582
+ this.onTrackDeleteElement(item);
583
+ }
584
+ else {
585
+ item.remove();
586
+ item.destroy();
587
+ }
588
+ }
589
+ /**
590
+ * 当前元素是否在留痕元素内
591
+ * @param target
592
+ * @param trackType
593
+ * @returns
594
+ */
595
+ isInCurrentUserTrack(target, trackType) {
596
+ if (target.parent instanceof TrackRunElement && target.parent.type === trackType && target.parent.props.userId === this.viewOptions.editUser.id) {
597
+ return true;
598
+ }
599
+ return false;
600
+ }
601
+ isInTrackElement(target, trackType) {
602
+ if (target.parent instanceof TrackRunElement && target.parent.type === trackType) {
603
+ return true;
604
+ }
605
+ return false;
606
+ }
607
+ /**
608
+ * 留痕除文本以外的其他元素
609
+ * @param control
610
+ */
611
+ onTrackDeleteElement(target) {
612
+ const parent = target.parent;
613
+ if (this.isInTrackElement(target, TrackRunTypeEnum.Deleted)) {
614
+ return;
615
+ }
616
+ //当前用户增加的内容,内容直接删除不需要留痕
617
+ if (this.isInCurrentUserTrack(target, TrackRunTypeEnum.Inserted)) {
618
+ target.remove();
619
+ this.removeEmtpyInlineBlock(parent);
620
+ return;
621
+ }
622
+ //target.remove();
623
+ const trackEle = this.getNextTrackElement(target, TrackRunTypeEnum.Deleted);
624
+ trackEle.addChild(target.clone(true), 0);
625
+ target.remove();
626
+ this.removeEmtpyInlineBlock(parent);
627
+ }
628
+ /**
629
+ * 更新文本删除留痕
630
+ */
631
+ updateDeletedTrackText(target, offset, len) {
632
+ if (this.isInTrackElement(target, TrackRunTypeEnum.Deleted)) {
633
+ return;
634
+ }
635
+ //当前用户增加的内容,当前用户删除时不需要留痕
636
+ if (this.isInCurrentUserTrack(target, TrackRunTypeEnum.Inserted)) {
637
+ target.splice(offset, len);
638
+ return;
639
+ }
640
+ //全部被删除
641
+ if (offset === 0 && len === target.textMeasures.length) {
642
+ const trackInputText = this.getNextTrackInputElement(target, TrackRunTypeEnum.Deleted);
643
+ trackInputText.text = target.text + trackInputText.text;
644
+ target.splice(0, target.textMeasures.length);
645
+ //target.remove();
646
+ return;
647
+ }
648
+ const { leftElement } = this.splitText(target, offset + len);
649
+ target = leftElement;
650
+ let trackText = this.getNextTrackInputElement(target, TrackRunTypeEnum.Deleted);
651
+ const spText = target.spliceText(target.textMeasures.length - len, target.textMeasures.length, true);
652
+ trackText.splice(0, 0, spText?.text);
653
+ }
654
+ getNextTrackInputElement(target, trackType) {
655
+ const trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id);
656
+ if (trackElement) {
657
+ const firstEle = trackElement.getChild(0);
658
+ if (firstEle && firstEle instanceof TextGroupElement) {
659
+ return firstEle;
660
+ }
661
+ else {
662
+ const newInput = new TextGroupElement();
663
+ trackElement.addChild(newInput, 0);
664
+ target.props.clone(newInput.props);
665
+ return newInput;
666
+ }
667
+ }
668
+ else {
669
+ const { trackElement, newTextGroup } = this.createTextTrackElement(target, target.props, TrackRunTypeEnum.Deleted);
670
+ target.parent.addChild(trackElement, target.getIndex() + 1);
671
+ return newTextGroup;
672
+ }
673
+ }
674
+ getNextTrackElement(target, trackType) {
675
+ let trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id);
676
+ if (!trackElement) {
677
+ trackElement = this.createTrackElement(trackType);
678
+ target.parent.addChild(trackElement, target.getIndex() + 1);
679
+ }
680
+ return trackElement;
681
+ }
682
+ /**
683
+ * 删除元素并定位光标
684
+ * @param control
685
+ * @returns
686
+ */
687
+ removeElement(control) {
688
+ const prevEle = ElementUtil.getRecursionPrevSiblingElement(control, false, true);
689
+ if (!prevEle) {
690
+ const nextEle = ElementUtil.getRecursionNextSiblingElement(control, true, true);
691
+ if (nextEle) {
692
+ this.selectionState.resetRange(nextEle, 0);
693
+ control.remove();
694
+ return;
695
+ }
696
+ return;
697
+ }
698
+ if (ElementUtil.isInSameParagraph(control, prevEle)) {
699
+ this.selectionState.resetRange(prevEle, -1);
700
+ control.remove();
701
+ return;
702
+ }
703
+ else {
704
+ const nextEle = ElementUtil.getRecursionNextSiblingElement(control, true, true);
705
+ if (nextEle && ElementUtil.getPrevSiblingElement(nextEle) === control) {
706
+ this.selectionState.resetRange(nextEle, 0);
707
+ control.remove();
708
+ return;
709
+ }
710
+ else {
711
+ this.selectionState.resetRange(prevEle, -1);
712
+ control.remove();
713
+ return;
714
+ }
715
+ }
716
+ }
717
+ /**
718
+ * 回车事件
719
+ */
720
+ onEnter() {
721
+ const { startControl } = this.selectionState;
722
+ const paragraph = ElementUtil.getParentByType(startControl, ParagraphElement);
723
+ const breakPara = this.splitCurrentParagraph();
724
+ //选中的是一个元素
725
+ if (breakPara === paragraph) {
726
+ const clonePara = paragraph.clone(false);
727
+ breakPara.parent.addChild(clonePara, breakPara.getIndex());
728
+ }
729
+ this.selectionState.resetRange(breakPara, 0);
730
+ }
731
+ /**
732
+ * 插入表格
733
+ * @param tb
734
+ * @returns
735
+ */
736
+ insertTable(tb) {
737
+ const breakPara = this.splitCurrentParagraph();
738
+ breakPara.parent.addChild(tb, breakPara.getIndex());
739
+ this.selectionState.resetRange(tb, 0);
740
+ }
741
+ /**
742
+ * 分割当前段落用于插入表格或者粘贴的内容
743
+ * @param insertItems 分割后插入的内容,内容需要是block或者表格对象
744
+ */
745
+ splitCurrentParagraph() {
746
+ const { startControl, startOffset } = this.selectionState;
747
+ const paragraph = ElementUtil.getParentByType(startControl, ParagraphElement);
748
+ const paraContainer = paragraph.parent;
749
+ //如果选中的是段落第一个元素
750
+ const firstLeaf = ElementUtil.getFirstLeafElement(paragraph);
751
+ if ((startControl === firstLeaf && startOffset === 0) || (startControl === firstLeaf && startControl instanceof PSymbolElement)) {
752
+ //this.selectionState.resetRange(paragraph, 0);
753
+ return paragraph;
754
+ }
755
+ const last = ElementUtil.getLastLeafElement(paragraph);
756
+ const selectedParaRange = RangeUtil.getSelctionRange(startControl, startOffset, last, 1, paragraph);
757
+ selectedParaRange.isFullSelected = false;
758
+ const breakPara = ElementUtil.cloneRange(selectedParaRange, true);
759
+ ElementUtil.fixParagraphContent(paragraph);
760
+ ElementUtil.fixParagraphContent(breakPara);
761
+ paraContainer.addChild(breakPara, paragraph.getIndex() + 1);
762
+ //paraContainer.addChild(tb, breakPara.getIndex());
763
+ //this.selectionState.resetRange(breakPara, 0);
764
+ return breakPara;
765
+ }
766
+ /**
767
+ * 合并段落
768
+ */
769
+ combineParagraph(prevPara, currPara, currElement) {
770
+ const prevParaLength = prevPara.length;
771
+ for (let i = 0; i < currPara.length; i++) {
772
+ const child = currPara.getChild(i).clone(true);
773
+ prevPara.addChild(child);
774
+ }
775
+ //currPara.remove();
776
+ const currParaContainer = currPara.parent;
777
+ currPara.destroy();
778
+ currParaContainer.removeChild(currPara);
779
+ this.selectionState.resetRange(prevPara.getChild(prevParaLength), 0);
780
+ }
781
+ /**
782
+ * 删除选中的区域内容
783
+ * @param range
784
+ */
785
+ deleteRange(range) {
786
+ const { selectedChildren } = range;
787
+ for (let i = selectedChildren.length - 1; i >= 0; i--) {
788
+ const childRange = selectedChildren[i];
789
+ const { target: childTarget, isFullSelected: childFullSelected } = childRange;
790
+ if (childTarget instanceof LeafElement && !childTarget.isDecorate) {
791
+ if (childFullSelected) {
792
+ this.onDeleteItem(childTarget);
793
+ }
794
+ else if (childTarget instanceof TextGroupElement) {
795
+ const { startOffset, endOffset } = childRange;
796
+ this.onDeleteText(childTarget, startOffset, endOffset - startOffset);
797
+ }
798
+ }
799
+ else if (childTarget instanceof BranchElement) {
800
+ //留痕模式
801
+ if (this.selectionState.enableTrackChanges) {
802
+ this.deleteRange(childRange);
803
+ }
804
+ else {
805
+ //表格全选状态时,执行删除操作
806
+ if (childTarget instanceof TableElement && childFullSelected) {
807
+ childTarget.remove();
808
+ childTarget.destroy();
809
+ }
810
+ //段落全选状态时,执行删除操作
811
+ else if (childTarget instanceof BlockContentElement && childFullSelected) {
812
+ childTarget.remove();
813
+ childTarget.destroy();
814
+ }
815
+ else if (childTarget instanceof InlineGroupElement && childFullSelected) {
816
+ childTarget.remove();
817
+ childTarget.destroy();
818
+ }
819
+ else {
820
+ this.deleteRange(childRange);
821
+ }
822
+ }
823
+ }
824
+ }
825
+ }
826
+ /**
827
+ * 表单区域删除处理
828
+ * @param range
829
+ * @returns
830
+ */
831
+ deleteRangeInFormEdit(range) {
832
+ const dataElement = ElementUtil.getDataElement(range.target);
833
+ //在数据元内删除,调用普通的删除处理
834
+ if (dataElement) {
835
+ this.deleteRange(range);
836
+ return;
837
+ }
838
+ //在数据元外删除
839
+ else {
840
+ this.loopForDelDataEleRange(range);
841
+ }
842
+ }
843
+ /**
844
+ * 表单模式:删除选中的区域内容
845
+ */
846
+ loopForDelDataEleRange(range) {
847
+ const { selectedChildren } = range;
848
+ for (let i = selectedChildren.length - 1; i >= 0; i--) {
849
+ const childRange = selectedChildren[i];
850
+ const { target: childTarget } = childRange;
851
+ if (childTarget instanceof BranchElement) {
852
+ if (childTarget instanceof DataElementInlineGroup) {
853
+ const dataEleProps = childTarget.props;
854
+ //数据元可编辑
855
+ if (dataEleProps.editable) {
856
+ this.deleteRange(childRange);
857
+ }
858
+ }
859
+ else {
860
+ this.loopForDelDataEleRange(childRange);
861
+ }
862
+ }
863
+ }
864
+ }
865
+ /**
866
+ * 向目标移动元素
867
+ * @param sourceElement
868
+ * @param moveElement
869
+ */
870
+ moveElement(targetElement, targetOffset, moveElement, moveOffset, ss) {
871
+ moveElement.remove();
872
+ if (targetElement instanceof TextGroupElement) {
873
+ const { leftElement, rightElement } = this.splitText(targetElement, targetOffset);
874
+ if (leftElement) {
875
+ leftElement.parent.addChild(moveElement, leftElement.getIndex() + 1);
876
+ }
877
+ else if (rightElement) {
878
+ rightElement.parent.addChild(moveElement, rightElement.getIndex());
879
+ }
880
+ }
881
+ else {
882
+ targetElement.parent.addChild(moveElement, targetElement.getIndex() + targetOffset);
883
+ }
884
+ ss.resetRange(moveElement, moveOffset);
885
+ }
886
+ /**
887
+ * 向指定的目标插入元素
888
+ * @param targetElement
889
+ * @param targetOffset
890
+ * @param destEleArray
891
+ */
892
+ insertElement(targetElement, targetOffset, destEleArray) {
893
+ let lastEle;
894
+ if (targetElement instanceof TextGroupElement) {
895
+ const { leftElement, rightElement } = this.splitText(targetElement, targetOffset);
896
+ if (leftElement) {
897
+ for (let i = 0; i < destEleArray.length; i++) {
898
+ lastEle = destEleArray[i];
899
+ leftElement.parent.addChild(lastEle, leftElement.getIndex() + 1 + i);
900
+ }
901
+ }
902
+ else if (rightElement) {
903
+ for (let i = 0; i < destEleArray.length; i++) {
904
+ lastEle = destEleArray[i];
905
+ rightElement.parent.addChild(lastEle, rightElement.getIndex());
906
+ }
907
+ }
908
+ }
909
+ else {
910
+ for (let i = 0; i < destEleArray.length; i++) {
911
+ lastEle = destEleArray[i];
912
+ targetElement.parent.addChild(lastEle, targetElement.getIndex() + targetOffset);
913
+ }
914
+ }
915
+ return lastEle;
916
+ }
917
+ /**
918
+ * 根据开始位置和结束位置,将字符切割成指定的区间
919
+ * @param splitTextUnit
920
+ * @param start
921
+ * @param end
922
+ * @returns
923
+ */
924
+ static splitTextGroupByRange(text, start, end) {
925
+ end = end === -1 ? text.textMeasures.length : end;
926
+ if (start === end) {
927
+ return null;
928
+ }
929
+ if (start === 0 && end === text.textMeasures.length) {
930
+ return text;
931
+ }
932
+ if (start === text.textMeasures.length) {
933
+ return null;
934
+ }
935
+ let lastTextGroup = text.spliceText(end, -1, true);
936
+ let middleTextGroup = text.spliceText(start, -1, true);
937
+ if (lastTextGroup) {
938
+ text.parent.addChild(lastTextGroup, text.getIndex() + 1);
939
+ }
940
+ if (!middleTextGroup) {
941
+ throw new Error('middleText is null');
942
+ }
943
+ text.parent.addChild(middleTextGroup, text.getIndex() + 1);
944
+ if (text.textMeasures.length === 0) {
945
+ text.remove();
946
+ text.destroy();
947
+ }
948
+ return middleTextGroup;
949
+ }
950
+ splitText(text, offset) {
951
+ offset = offset == -1 ? text.textMeasures.length : offset;
952
+ if (offset === text.textMeasures.length) {
953
+ return {
954
+ leftElement: text,
955
+ rightElement: null
956
+ };
957
+ }
958
+ if (offset === 0) {
959
+ return {
960
+ leftElement: null,
961
+ rightElement: text
962
+ };
963
+ }
964
+ const rightText = text.spliceText(offset, -1, true);
965
+ if (rightText) {
966
+ text.parent.addChild(rightText, text.getIndex() + 1);
967
+ }
968
+ let leftText = text;
969
+ if (text.textMeasures.length === 0) {
970
+ text.remove();
971
+ leftText = null;
972
+ }
973
+ return {
974
+ leftElement: leftText,
975
+ rightElement: rightText
976
+ };
977
+ }
978
+ /**
979
+ * 设置选中的文本样式
980
+ * @param ss
981
+ * @param setterFunc
982
+ * @returns
983
+ */
984
+ static setTextStyle(ss, setterFunc) {
985
+ const range = ss.selectedRange;
986
+ if (!range || ss.collapsed) {
987
+ return;
988
+ }
989
+ const newSelectionRange = new SelectionRange();
990
+ const startRange = ElementUtil.getFirstSelectedRange(range);
991
+ const endRange = ElementUtil.getLastSelectedRange(range);
992
+ this.recursionSetRangeTextStyle(range, setterFunc);
993
+ if (startRange === endRange) {
994
+ if (startRange.isFullSelected) {
995
+ newSelectionRange.setStart(startRange.target, 0);
996
+ newSelectionRange.setEnd(startRange.target, -1);
997
+ }
998
+ if (startRange.target instanceof TextGroupElement) {
999
+ const startSelectedOffset = ss.startOffset;
1000
+ const endSelectedOffset = ss.endOffset;
1001
+ const middleElement = this.splitTextGroupByRange(startRange.target, startSelectedOffset, endSelectedOffset);
1002
+ if (middleElement) {
1003
+ setterFunc(middleElement.props);
1004
+ newSelectionRange.setStart(middleElement, 0);
1005
+ newSelectionRange.setEnd(middleElement, -1);
1006
+ }
1007
+ }
1008
+ }
1009
+ else {
1010
+ if (startRange.isFullSelected) {
1011
+ newSelectionRange.setStart(startRange.target, 0);
1012
+ }
1013
+ else {
1014
+ if (startRange.target instanceof TextGroupElement) {
1015
+ const middleElement = this.splitTextGroupByRange(startRange.target, startRange.startOffset, -1);
1016
+ if (middleElement) {
1017
+ setterFunc(middleElement.props);
1018
+ newSelectionRange.setStart(middleElement, 0);
1019
+ }
1020
+ else {
1021
+ newSelectionRange.setStart(startRange.target, 0);
1022
+ }
1023
+ }
1024
+ else {
1025
+ newSelectionRange.setStart(startRange.target, startRange.startOffset);
1026
+ }
1027
+ }
1028
+ if (endRange.isFullSelected) {
1029
+ newSelectionRange.setEnd(endRange.target, -1);
1030
+ }
1031
+ else {
1032
+ if (endRange.target instanceof TextGroupElement) {
1033
+ const middleElement = this.splitTextGroupByRange(endRange.target, 0, endRange.endOffset);
1034
+ if (middleElement) {
1035
+ setterFunc(middleElement.props);
1036
+ newSelectionRange.setEnd(middleElement, -1);
1037
+ }
1038
+ else {
1039
+ newSelectionRange.setStart(endRange.target, 0);
1040
+ }
1041
+ }
1042
+ else {
1043
+ newSelectionRange.setEnd(endRange.target, endRange.endOffset);
1044
+ }
1045
+ }
1046
+ }
1047
+ ss.addRange(newSelectionRange);
1048
+ }
1049
+ static recursionSetRangeTextStyle(range, setterFunc) {
1050
+ RangeUtil.recursionTraversalRangeHandler(range, (itemRange) => {
1051
+ if (itemRange.target instanceof TextGroupElement && itemRange.isFullSelected) {
1052
+ setterFunc(itemRange.target.props);
1053
+ }
1054
+ });
1055
+ }
1056
+ static setParaAlign(ss, setterFunc) {
1057
+ if (ss.collapsed && ss.startControl) {
1058
+ const para = ElementUtil.getParentByType(ss.startControl, ParagraphElement);
1059
+ if (para) {
1060
+ setterFunc(para.props);
1061
+ }
1062
+ }
1063
+ else {
1064
+ const range = ss.selectedRange;
1065
+ if (!range) {
1066
+ return;
1067
+ }
1068
+ RangeUtil.recursionTraversalRangeHandler(range, (itemRange) => {
1069
+ if (itemRange.target instanceof ParagraphElement) {
1070
+ setterFunc(itemRange.target.props);
1071
+ }
1072
+ });
1073
+ }
1074
+ }
1075
+ /**
1076
+ * 复制
1077
+ * @param evt
1078
+ * @returns
1079
+ */
1080
+ onCopy(evt) {
1081
+ evt.preventDefault();
1082
+ const copySerializeStr = ElementSerialize.getSelectedJSON(this.selectionState, this.viewOptions);
1083
+ if (!copySerializeStr) {
1084
+ return;
1085
+ }
1086
+ evt.clipboardData?.setData('doc/plain', copySerializeStr);
1087
+ const copyStr = ElementSerialize.getSelectedText(this.selectionState, this.viewOptions);
1088
+ evt.clipboardData?.setData('text/plain', copyStr);
1089
+ }
1090
+ /**
1091
+ * 剪切
1092
+ * @param evt
1093
+ */
1094
+ onCut(evt) {
1095
+ this.onCopy(evt);
1096
+ this.onRangeDelete();
1097
+ }
1098
+ /**
1099
+ * 粘贴
1100
+ * @param evt
1101
+ * @returns
1102
+ */
1103
+ onPaste(evt) {
1104
+ evt.preventDefault();
1105
+ let pasteText = evt.clipboardData?.getData('text/plain');
1106
+ const pasteData = evt.clipboardData?.getData('doc/plain');
1107
+ if (!pasteData) {
1108
+ if (pasteText) {
1109
+ this.pastePlainText(pasteText);
1110
+ }
1111
+ return;
1112
+ }
1113
+ const pasteElement = this.eleReader.readElement(JSON.parse(pasteData));
1114
+ if (!pasteElement) {
1115
+ console.log('粘贴反序列化数据失败', pasteData);
1116
+ return;
1117
+ }
1118
+ const { collapsed } = this.selectionState;
1119
+ let { startControl, startOffset } = this.selectionState;
1120
+ if (!collapsed) {
1121
+ //TODO:如果一个容器内的元素被全部删除,则返回 null
1122
+ // const { cursorEle, cursorOffset } = this.onRangeDelete();
1123
+ // startControl = cursorEle;
1124
+ // startOffset = cursorOffset;
1125
+ }
1126
+ if (!startControl) {
1127
+ return;
1128
+ }
1129
+ //表单模式:如果复制的是单格式的文本,需要序列化为纯文本处理
1130
+ if (this.viewOptions.docMode === DocMode.FormEdit) {
1131
+ const pasteString = ElementSerialize.serializeString(pasteElement, { all: false });
1132
+ if (pasteString) {
1133
+ this.pastePlainText(pasteString);
1134
+ }
1135
+ return;
1136
+ }
1137
+ if (pasteElement instanceof ParagraphElement || pasteElement instanceof InlineGroupElement) {
1138
+ const children = [];
1139
+ if (pasteElement instanceof ParagraphElement) {
1140
+ children.push(...ElementUtil.getChildrenElements(pasteElement));
1141
+ }
1142
+ else if (pasteElement instanceof InlineGroupElement) {
1143
+ children.push(pasteElement);
1144
+ }
1145
+ if (!children.length) {
1146
+ throw new Error('段落子元素为空');
1147
+ }
1148
+ const lastEle = this.insertElement(startControl, startOffset, children);
1149
+ this.selectionState.resetRange(lastEle, -1);
1150
+ return;
1151
+ }
1152
+ console.log('粘贴:' + pasteData);
1153
+ }
1154
+ insertSoftBr() {
1155
+ let { startControl, startOffset } = this.selectionState;
1156
+ const lastEle = this.insertElement(startControl, startOffset, [new BreakElement()]);
1157
+ const focusEle = ElementUtil.getNextSiblingElement(lastEle);
1158
+ if (focusEle) {
1159
+ this.selectionState.resetRange(focusEle, 0);
1160
+ }
1161
+ }
1162
+ /**
1163
+ * 处理黏贴的纯文本
1164
+ * @param text
1165
+ */
1166
+ pastePlainText(text) {
1167
+ const textItems = text.split(/\r?\n/);
1168
+ const { startControl, startOffset } = this.selectionState;
1169
+ if (this.viewOptions.docMode === DocMode.FormEdit || textItems.length === 1 || IsInSideInlineGroupInputElement(startControl, startOffset)) {
1170
+ text = text.replace(/[\n\r]/g, '');
1171
+ this.newInput({
1172
+ data: text,
1173
+ compositionStartInfo: {
1174
+ element: startControl,
1175
+ offset: startOffset
1176
+ }
1177
+ });
1178
+ }
1179
+ else {
1180
+ const breakPara = this.splitCurrentParagraph();
1181
+ for (let i = 0; i < textItems.length; i++) {
1182
+ const newPara = breakPara.clone(false);
1183
+ const inputTextProps = newPara.props.textProps;
1184
+ const newTextEle = ElementUtil.getNewTextGroup(inputTextProps);
1185
+ newTextEle.text = textItems[i];
1186
+ newPara.addChild(newTextEle, 0);
1187
+ breakPara.parent.addChild(newPara, breakPara.getIndex());
1188
+ }
1189
+ this.selectionState.resetRange(breakPara, 0);
1190
+ }
1191
+ }
1192
+ /**
1193
+ * 设置当前段落项目符号类型
1194
+ */
1195
+ setParagraphNumberType() {
1196
+ const { startControl } = this.selectionState;
1197
+ if (!startControl) {
1198
+ return;
1199
+ }
1200
+ const para = ElementUtil.getParentByType(startControl, ParagraphElement);
1201
+ if (para.props.numberType >= 0) {
1202
+ para.props.numberType = -1;
1203
+ para.props.indent = 0;
1204
+ }
1205
+ else {
1206
+ para.props.numberType = 0;
1207
+ para.props.indent = 15;
1208
+ }
1209
+ }
1210
+ /**
1211
+ * 插入批注
1212
+ */
1213
+ insertComment() {
1214
+ const { startControl, startOffset, endControl, endOffset, collapsed } = this.selectionState;
1215
+ if (collapsed || !startControl || !endControl) {
1216
+ return;
1217
+ }
1218
+ const id = nanoid(5);
1219
+ const startCommMark = new CommentElement();
1220
+ startCommMark.props.id = id;
1221
+ startCommMark.props.markType = 'start';
1222
+ const endCommMark = new CommentElement();
1223
+ endCommMark.props.id = id;
1224
+ endCommMark.props.markType = 'end';
1225
+ this.insertElement(endControl, endOffset, [endCommMark]);
1226
+ this.insertElement(startControl, startOffset, [startCommMark]);
1227
+ const commContent = new CommContentElement();
1228
+ commContent.props.id = id;
1229
+ commContent.props.createId = this.viewOptions.editUser.id;
1230
+ commContent.props.createName = this.viewOptions.editUser.name;
1231
+ commContent.props.createDate = new Date();
1232
+ const pos = this.docComment.getCommMarkIndex(startCommMark);
1233
+ if (pos < 0) {
1234
+ throw new Error('获取插入的批注位置不正确');
1235
+ }
1236
+ this.docCtx.document.commentsContainerElement.addChild(commContent, pos);
1237
+ this.selectionState.clear();
1238
+ this.docComment.afterCommentsChanged();
1239
+ }
1240
+ validate() {
1241
+ const dataEleList = this.docCtx.document.treeFilter(item => item instanceof DataElementInlineGroup);
1242
+ const errorEleList = dataEleList.map(item => ({ error: item.validate(), ele: item })).filter(item => item.error);
1243
+ if (!errorEleList.length) {
1244
+ return true;
1245
+ }
1246
+ errorEleList.forEach(item => {
1247
+ const id = nanoid(5);
1248
+ const startCommMark = new CommentElement();
1249
+ startCommMark.props.id = id;
1250
+ startCommMark.props.markType = 'start';
1251
+ const endCommMark = new CommentElement();
1252
+ endCommMark.props.id = id;
1253
+ endCommMark.props.markType = 'end';
1254
+ item.ele.addChild(startCommMark, 0);
1255
+ item.ele.addChild(endCommMark, item.ele.length);
1256
+ const caption = CommonUtil.nullToString(item.ele.props.caption);
1257
+ const validateElement = new ValidateElement();
1258
+ validateElement.props.title = caption + '验证';
1259
+ validateElement.props.id = id;
1260
+ validateElement.setContent(item.error);
1261
+ const pos = this.docComment.getCommMarkIndex(startCommMark);
1262
+ this.docCtx.document.commentsContainerElement.addChild(validateElement, pos);
1263
+ });
1264
+ this.docCtx.selectionState.clear();
1265
+ this.docComment.afterCommentsChanged();
1266
+ return false;
1267
+ }
1268
+ /**
1269
+ * 移除空字符串
1270
+ * @param text
1271
+ */
1272
+ removeEmptyText(text) {
1273
+ //const nextLeafElementInPara = ElementUtil.getRecursionNextSiblingElement(text, true, true); getComputedStyle
1274
+ this.setCurosrForDeleteAction(text);
1275
+ const parent = text.parent;
1276
+ text.remove();
1277
+ this.removeEmtpyInlineBlock(parent);
1278
+ }
1279
+ setCurosrForDeleteAction(control) {
1280
+ const cursorInfo = this.getCursorElementByDeleteAction(control);
1281
+ if (cursorInfo) {
1282
+ this.selectionState.resetRange(cursorInfo.ele, cursorInfo.offset);
1283
+ }
1284
+ else {
1285
+ this.selectionState.clear();
1286
+ }
1287
+ }
1288
+ getCursorElementByDeleteAction(control) {
1289
+ const prevLeafElementInPara = ElementUtil.getRecursionPrevSiblingElement(control, false, true);
1290
+ //判断是否为同一段落
1291
+ if (prevLeafElementInPara && ElementUtil.isInSameParagraph(prevLeafElementInPara, control)) {
1292
+ return {
1293
+ ele: prevLeafElementInPara,
1294
+ offset: ElementUtil.getElementEndOffset(prevLeafElementInPara)
1295
+ };
1296
+ }
1297
+ //同一段落其他元素
1298
+ const nextLeafElementInPara = ElementUtil.getRecursionNextSiblingElement(control, true, true);
1299
+ if (nextLeafElementInPara) {
1300
+ return {
1301
+ ele: nextLeafElementInPara,
1302
+ offset: 0
1303
+ };
1304
+ }
1305
+ //上一段落
1306
+ if (prevLeafElementInPara) {
1307
+ return {
1308
+ ele: prevLeafElementInPara,
1309
+ offset: prevLeafElementInPara instanceof PSymbolElement ? 0 : ElementUtil.getElementEndOffset(prevLeafElementInPara)
1310
+ };
1311
+ }
1312
+ return null;
1313
+ }
1314
+ /**
1315
+ * 移除空行内标签
1316
+ * @param ele
1317
+ */
1318
+ removeEmtpyInlineBlock(ele) {
1319
+ if (ele instanceof InlineGroupElement && ele.length === 0) {
1320
+ const parent = ele.parent;
1321
+ ele.remove();
1322
+ this.removeEmtpyInlineBlock(parent);
1323
+ }
1324
+ }
1325
+ /**
1326
+ * 插入强制换页符号
1327
+ */
1328
+ insertPageBreakPara() {
1329
+ const { startControl } = this.selectionState;
1330
+ const currPara = ElementUtil.getParentByType(startControl, ParagraphElement);
1331
+ if (!currPara) {
1332
+ return;
1333
+ }
1334
+ if (currPara.parent instanceof DocumentBodyElement) {
1335
+ const pageBreak = new ParagraphElement();
1336
+ pageBreak.props.pageBreak = true;
1337
+ pageBreak.props.textAlign = 'center';
1338
+ pageBreak.parent.addChild(pageBreak);
1339
+ }
1340
+ }
1341
+ }
1342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtY2hhbmdlLmpzIiwic291cmNlUm9vdCI6ImxpYi8iLCJzb3VyY2VzIjpbImZyYW1ld29yay9kb2N1bWVudC1jaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNILHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLE9BQU8sRUFFUCxrQkFBa0IsRUFDbEIsV0FBVyxFQUdkLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFN0UsT0FBTyxFQUNILHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLCtCQUErQixFQUNsQyxNQUFNLDRDQUE0QyxDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFB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