@hailin-zheng/editor-core 1.0.4 → 1.0.7

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