@hailin-zheng/editor-core 1.0.15 → 1.0.22

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 (149) hide show
  1. package/README.md +1613 -0
  2. package/lib/framework/element-props.d.ts +2 -2
  3. package/lib/framework/impl/index.d.ts +36 -0
  4. package/lib/index.d.ts +34 -0
  5. package/lib/index.js +15672 -0
  6. package/lib/texteditor.d.ts +3 -3
  7. package/package.json +27 -26
  8. package/lib/doc-ruler.js +0 -313
  9. package/lib/doc-ruler.js.map +0 -1
  10. package/lib/framework/common-util.js +0 -178
  11. package/lib/framework/common-util.js.map +0 -1
  12. package/lib/framework/document-change.js +0 -1342
  13. package/lib/framework/document-change.js.map +0 -1
  14. package/lib/framework/document-combine.js +0 -40
  15. package/lib/framework/document-combine.js.map +0 -1
  16. package/lib/framework/document-comment.js +0 -148
  17. package/lib/framework/document-comment.js.map +0 -1
  18. package/lib/framework/document-context.js +0 -330
  19. package/lib/framework/document-context.js.map +0 -1
  20. package/lib/framework/document-eval-func.js +0 -48
  21. package/lib/framework/document-eval-func.js.map +0 -1
  22. package/lib/framework/document-event.js +0 -1054
  23. package/lib/framework/document-event.js.map +0 -1
  24. package/lib/framework/document-history.js +0 -65
  25. package/lib/framework/document-history.js.map +0 -1
  26. package/lib/framework/document-images-loader.js +0 -66
  27. package/lib/framework/document-images-loader.js.map +0 -1
  28. package/lib/framework/document-input-cursor.js +0 -239
  29. package/lib/framework/document-input-cursor.js.map +0 -1
  30. package/lib/framework/document-paint.js +0 -103
  31. package/lib/framework/document-paint.js.map +0 -1
  32. package/lib/framework/document-print-offscreen.js +0 -128
  33. package/lib/framework/document-print-offscreen.js.map +0 -1
  34. package/lib/framework/document-print.js +0 -203
  35. package/lib/framework/document-print.js.map +0 -1
  36. package/lib/framework/document-segmenter.js +0 -106
  37. package/lib/framework/document-segmenter.js.map +0 -1
  38. package/lib/framework/document-selection.js +0 -358
  39. package/lib/framework/document-selection.js.map +0 -1
  40. package/lib/framework/document-template.js +0 -20
  41. package/lib/framework/document-template.js.map +0 -1
  42. package/lib/framework/document-textline-mode.js +0 -30
  43. package/lib/framework/document-textline-mode.js.map +0 -1
  44. package/lib/framework/element-define.js +0 -579
  45. package/lib/framework/element-define.js.map +0 -1
  46. package/lib/framework/element-event-define.js +0 -108
  47. package/lib/framework/element-event-define.js.map +0 -1
  48. package/lib/framework/element-measure.js +0 -551
  49. package/lib/framework/element-measure.js.map +0 -1
  50. package/lib/framework/element-paint.js +0 -170
  51. package/lib/framework/element-paint.js.map +0 -1
  52. package/lib/framework/element-props.js +0 -809
  53. package/lib/framework/element-props.js.map +0 -1
  54. package/lib/framework/element-reader.js +0 -151
  55. package/lib/framework/element-reader.js.map +0 -1
  56. package/lib/framework/element-render-cut.js +0 -449
  57. package/lib/framework/element-render-cut.js.map +0 -1
  58. package/lib/framework/element-serialize.js +0 -113
  59. package/lib/framework/element-serialize.js.map +0 -1
  60. package/lib/framework/element-util.js +0 -1463
  61. package/lib/framework/element-util.js.map +0 -1
  62. package/lib/framework/impl/checkbox/checkbox-impl.js +0 -64
  63. package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  64. package/lib/framework/impl/comments/comment-content-impl.js +0 -105
  65. package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
  66. package/lib/framework/impl/comments/comment-element-impl.js +0 -62
  67. package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
  68. package/lib/framework/impl/comments/comments-container-impl.js +0 -62
  69. package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
  70. package/lib/framework/impl/comments/comments-util.js +0 -67
  71. package/lib/framework/impl/comments/comments-util.js.map +0 -1
  72. package/lib/framework/impl/comments/validate-msg-impl.js +0 -83
  73. package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
  74. package/lib/framework/impl/data-element/data-decorate-impl.js +0 -91
  75. package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  76. package/lib/framework/impl/data-element/data-element-barcode.js +0 -115
  77. package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
  78. package/lib/framework/impl/data-element/data-element-base-impl.js +0 -205
  79. package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  80. package/lib/framework/impl/data-element/data-element-check-impl.js +0 -133
  81. package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  82. package/lib/framework/impl/data-element/data-element-date-impl.js +0 -111
  83. package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  84. package/lib/framework/impl/data-element/data-element-group-impl.js +0 -130
  85. package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  86. package/lib/framework/impl/data-element/data-element-image-impl.js +0 -137
  87. package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  88. package/lib/framework/impl/data-element/data-element-list-impl.js +0 -131
  89. package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  90. package/lib/framework/impl/data-element/data-element-text-impl.js +0 -103
  91. package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  92. package/lib/framework/impl/decorate/fill-null-space-imple.js +0 -43
  93. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  94. package/lib/framework/impl/document/doc-body-impl.js +0 -79
  95. package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
  96. package/lib/framework/impl/document/doc-body-part-impl.js +0 -94
  97. package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
  98. package/lib/framework/impl/document/doc-container-impl.js +0 -21
  99. package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
  100. package/lib/framework/impl/document/doc-footer-impl.js +0 -77
  101. package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
  102. package/lib/framework/impl/document/doc-header-impl.js +0 -83
  103. package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
  104. package/lib/framework/impl/document/doc-impl.js +0 -209
  105. package/lib/framework/impl/document/doc-impl.js.map +0 -1
  106. package/lib/framework/impl/media-formula/menstrual-history.js +0 -153
  107. package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
  108. package/lib/framework/impl/paragraph/p-impl.js +0 -156
  109. package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
  110. package/lib/framework/impl/picture/image-impl.js +0 -124
  111. package/lib/framework/impl/picture/image-impl.js.map +0 -1
  112. package/lib/framework/impl/radio/radio-impl.js +0 -72
  113. package/lib/framework/impl/radio/radio-impl.js.map +0 -1
  114. package/lib/framework/impl/symbol/br-symbol-impl.js +0 -54
  115. package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  116. package/lib/framework/impl/symbol/p-symbol-impl.js +0 -54
  117. package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  118. package/lib/framework/impl/table/table-cell-impl.js +0 -145
  119. package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
  120. package/lib/framework/impl/table/table-impl.js +0 -363
  121. package/lib/framework/impl/table/table-impl.js.map +0 -1
  122. package/lib/framework/impl/table/table-row-impl.js +0 -75
  123. package/lib/framework/impl/table/table-row-impl.js.map +0 -1
  124. package/lib/framework/impl/table/table-split-cell-patch.js +0 -89
  125. package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
  126. package/lib/framework/impl/table/table-split-cell.js +0 -464
  127. package/lib/framework/impl/table/table-split-cell.js.map +0 -1
  128. package/lib/framework/impl/table/table-util.js +0 -678
  129. package/lib/framework/impl/table/table-util.js.map +0 -1
  130. package/lib/framework/impl/text/text-impl.js +0 -149
  131. package/lib/framework/impl/text/text-impl.js.map +0 -1
  132. package/lib/framework/impl/text/track-run-impl.js +0 -112
  133. package/lib/framework/impl/text/track-run-impl.js.map +0 -1
  134. package/lib/framework/notify.js +0 -116
  135. package/lib/framework/notify.js.map +0 -1
  136. package/lib/framework/range-util.js +0 -312
  137. package/lib/framework/range-util.js.map +0 -1
  138. package/lib/framework/render-context.js +0 -384
  139. package/lib/framework/render-context.js.map +0 -1
  140. package/lib/framework/render-define.js +0 -195
  141. package/lib/framework/render-define.js.map +0 -1
  142. package/lib/framework/selection-overlays.js +0 -124
  143. package/lib/framework/selection-overlays.js.map +0 -1
  144. package/lib/texteditor.js +0 -913
  145. package/lib/texteditor.js.map +0 -1
  146. package/lib/util/subject.js +0 -88
  147. package/lib/util/subject.js.map +0 -1
  148. package/lib/util/table-bind.js +0 -6
  149. package/lib/util/table-bind.js.map +0 -1
@@ -1,312 +0,0 @@
1
- import { BranchElement, LeafElement } from "./element-define";
2
- import { ElementUtil } from "./element-util";
3
- import { TableCellElement } from "./impl/table/table-cell-impl";
4
- import { TableElement } from "./impl/table/table-impl";
5
- import { TableRowElement } from "./impl/table/table-row-impl";
6
- import { SelectionRange } from './document-selection';
7
- import { TextGroupElement } from "./impl/text/text-impl";
8
- export class RangeUtil {
9
- static getSelctionRange(startControl, startOffset, endControl, endOffset, ancestorCommonControl) {
10
- if (ancestorCommonControl instanceof TableElement || ancestorCommonControl instanceof TableRowElement) {
11
- const tbElement = ancestorCommonControl instanceof TableElement ? ancestorCommonControl : ancestorCommonControl.parent;
12
- return this.getTableSelectionRange(startControl, startOffset, endControl, endOffset, tbElement);
13
- }
14
- if (startControl === endControl && startControl.parent === ancestorCommonControl) {
15
- return this.getCollapsedRange(startControl, startOffset, endOffset, ancestorCommonControl);
16
- }
17
- const startRange = this.getStartForbackTreeData(startControl, ancestorCommonControl, null, startOffset).selectedChildren[0];
18
- const endRange = this.getEndForwardTreeData(endControl, ancestorCommonControl, null, endOffset).selectedChildren[0];
19
- const startIndex = ancestorCommonControl.getChildIndex(startRange.target);
20
- const endIndex = ancestorCommonControl.getChildIndex(endRange.target);
21
- const commonRange = this.getChildTreeData(ancestorCommonControl, startIndex + 1, endIndex);
22
- if (this.rangeEquals(startRange, endRange)) {
23
- commonRange.selectedChildren.unshift(startRange);
24
- }
25
- else {
26
- commonRange.selectedChildren.unshift(startRange);
27
- commonRange.selectedChildren.push(endRange);
28
- }
29
- this.setRangeFullSelected(commonRange);
30
- return commonRange;
31
- }
32
- static getCollapsedRange(startControl, startOffset, endOffset, ancestorCommonControl) {
33
- const range = {
34
- target: ancestorCommonControl,
35
- isFullSelected: false,
36
- startOffset: startControl.getIndex(),
37
- endOffset: startControl.getIndex() + 1,
38
- selectedChildren: [this.getChildTreeData(startControl, startOffset, endOffset)]
39
- };
40
- this.setRangeFullSelected(range);
41
- return range;
42
- }
43
- /**
44
- * 获取表格选区的内容
45
- * @param startControl
46
- * @param startOffset
47
- * @param endControl
48
- * @param endOffset
49
- * @param tb
50
- */
51
- static getTableSelectionRange(startControl, startOffset, endControl, endOffset, tb) {
52
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
53
- const endCell = ElementUtil.getParentByType(endControl, TableCellElement);
54
- if (startCell && endCell && startCell.parent.parent === tb && endCell.parent.parent === tb) {
55
- let startRowIndex = startCell.parent.getIndex();
56
- let endRowIndex = endCell.parent.getIndex();
57
- let startColIndex = startCell.getIndex();
58
- let endColIndex = endCell.getIndex();
59
- if (startColIndex > endColIndex) {
60
- [startColIndex, endColIndex] = [endColIndex, startColIndex];
61
- }
62
- if (startRowIndex > endRowIndex) {
63
- [startRowIndex, endRowIndex] = [endRowIndex, startRowIndex];
64
- }
65
- const region = { startRow: startRowIndex, endRow: endRowIndex, startCol: startColIndex, endCol: endColIndex }; //this.getTableRectSelectedRegion(tb, { startRow: startRowIndex, endRow: endRowIndex, startCol: startColIndex, endCol: endColIndex });
66
- startRowIndex = region.startRow;
67
- endRowIndex = region.endRow;
68
- startColIndex = region.startCol;
69
- endColIndex = region.endCol;
70
- const rowRanges = [];
71
- for (let i = startRowIndex; i <= endRowIndex; i++) {
72
- const cellRanges = [];
73
- const row = tb.getChild(i);
74
- for (let j = startColIndex; j <= endColIndex; j++) {
75
- const cell = row.getChild(j);
76
- const cellFirstLeafElement = ElementUtil.getFirstLeafElement(cell);
77
- const cellLastLeafElement = ElementUtil.getLastLeafElement(cell);
78
- if (!cellFirstLeafElement && !cell.isNotBeMergedCell()) {
79
- cellRanges.push({
80
- target: cell,
81
- isFullSelected: true,
82
- startOffset: 0,
83
- endOffset: 1,
84
- selectedChildren: []
85
- });
86
- }
87
- else {
88
- const cellRange = this.getSelctionRange(cellFirstLeafElement, 0, cellLastLeafElement, 1, cell);
89
- cellRanges.push(cellRange);
90
- }
91
- }
92
- const rowRange = {
93
- target: row,
94
- isFullSelected: false,
95
- startOffset: startColIndex,
96
- endOffset: endColIndex,
97
- selectedChildren: [...cellRanges]
98
- };
99
- rowRange.isFullSelected = startColIndex === 0 && endColIndex === row.length - 1;
100
- rowRanges.push(rowRange);
101
- }
102
- const tableRange = {
103
- target: tb,
104
- isFullSelected: false,
105
- startOffset: startRowIndex,
106
- endOffset: endRowIndex,
107
- selectedChildren: [...rowRanges]
108
- };
109
- tableRange.isFullSelected = startRowIndex === 0 && endRowIndex === tb.length - 1 && tableRange.selectedChildren.every(item => item.isFullSelected);
110
- return tableRange;
111
- }
112
- else {
113
- throw new Error('当前单元格和表格不对应');
114
- }
115
- }
116
- static getStartForbackTreeData(control, ancestorCommonControl, childData, offset) {
117
- if (!control) {
118
- debugger;
119
- }
120
- const parent = control.parent;
121
- if (parent !== ancestorCommonControl) {
122
- const range = this.getChildTreeData(parent, parent.getChildIndex(control) + 1, -1);
123
- if (childData) {
124
- range.selectedChildren.unshift(childData);
125
- }
126
- else {
127
- range.selectedChildren.unshift(this.getChildTreeData(control, offset, -1));
128
- }
129
- this.setRangeFullSelected(range);
130
- return this.getStartForbackTreeData(parent, ancestorCommonControl, range, -99);
131
- }
132
- else {
133
- const ancestorRange = {
134
- target: ancestorCommonControl,
135
- startOffset: -1,
136
- endOffset: -1,
137
- isFullSelected: false,
138
- selectedChildren: []
139
- };
140
- if (!childData) {
141
- childData = this.getChildTreeData(control, offset, -1);
142
- }
143
- ancestorRange.selectedChildren.push(childData);
144
- this.setRangeFullSelected(ancestorRange);
145
- return ancestorRange;
146
- }
147
- }
148
- static getEndForwardTreeData(control, ancestorCommonControl, childData, offset) {
149
- const parent = control.parent;
150
- if (parent !== ancestorCommonControl) {
151
- const range = this.getChildTreeData(parent, 0, parent.getChildIndex(control));
152
- if (childData) {
153
- range.selectedChildren.push(childData);
154
- }
155
- else {
156
- range.selectedChildren.push(this.getChildTreeData(control, 0, offset));
157
- }
158
- this.setRangeFullSelected(range);
159
- return this.getEndForwardTreeData(parent, ancestorCommonControl, range, -99);
160
- }
161
- else {
162
- const ancestorRange = {
163
- target: ancestorCommonControl,
164
- startOffset: 0,
165
- endOffset: 0,
166
- isFullSelected: false,
167
- selectedChildren: []
168
- };
169
- if (!childData) {
170
- childData = this.getChildTreeData(control, 0, offset);
171
- }
172
- ancestorRange.selectedChildren.push(childData);
173
- this.setRangeFullSelected(ancestorRange);
174
- return ancestorRange;
175
- }
176
- }
177
- static getChildTreeData(control, start, end) {
178
- const range = {
179
- target: control,
180
- isFullSelected: false,
181
- startOffset: start,
182
- endOffset: end,
183
- selectedChildren: []
184
- };
185
- if (control instanceof LeafElement) {
186
- if (control instanceof TextGroupElement) {
187
- range.endOffset = end === -1 ? control.text.length : end;
188
- }
189
- else {
190
- range.endOffset = end === -1 ? 1 : end;
191
- }
192
- }
193
- else if (control instanceof BranchElement) {
194
- end = end === -1 ? control.length : end;
195
- for (let i = start; i < end; i++) {
196
- const child = control.getChild(i);
197
- range.selectedChildren.push(this.getChildTreeData(child, 0, -1));
198
- }
199
- }
200
- this.setRangeFullSelected(range);
201
- return range;
202
- }
203
- static setRangeFullSelected(selectionRange) {
204
- if (selectionRange.target instanceof LeafElement) {
205
- const { startOffset, endOffset } = selectionRange;
206
- if (selectionRange.target instanceof TextGroupElement) {
207
- selectionRange.isFullSelected = startOffset === 0 && endOffset === selectionRange.target.text.length;
208
- }
209
- else {
210
- selectionRange.isFullSelected = startOffset === 0 && endOffset === 1;
211
- }
212
- }
213
- else if (selectionRange.target instanceof BranchElement) {
214
- const parent = selectionRange.target;
215
- const selectedChildren = selectionRange.selectedChildren;
216
- //被合并的table-cell,内容为empty
217
- if (selectedChildren.length === 0) {
218
- if (selectionRange.startOffset === 0 && selectionRange.endOffset === -1) {
219
- selectionRange.isFullSelected = true;
220
- return;
221
- }
222
- selectionRange.isFullSelected = false;
223
- return;
224
- }
225
- const firstItem = selectedChildren[0];
226
- const firstItemIndex = parent.getChildIndex(firstItem.target);
227
- const lastItem = selectedChildren[selectedChildren.length - 1];
228
- const lastItemIndex = parent.getChildIndex(lastItem.target);
229
- selectionRange.startOffset = firstItemIndex;
230
- selectionRange.endOffset = lastItemIndex;
231
- selectionRange.isFullSelected = firstItemIndex === 0 && firstItem.isFullSelected && lastItemIndex === parent.length - 1 && lastItem.isFullSelected;
232
- }
233
- }
234
- static rangeEquals(selRange1, selRange2) {
235
- return selRange1.target === selRange2.target && selRange1.startOffset === selRange2.startOffset && selRange1.endOffset === selRange2.endOffset;
236
- }
237
- /**
238
- * 根据选区范围更正选区内容状态
239
- * @param selectedRange
240
- * @param selectionState
241
- */
242
- static fixSelectionStateByRange(selectionState) {
243
- const { startControl, startOffset, endControl, endOffset, selectedRange } = selectionState;
244
- if (!selectedRange || !startControl) {
245
- return false;
246
- }
247
- const startRange = this.getStartRangeTarget(selectedRange);
248
- const endRange = this.getEndRangeTarget(selectedRange);
249
- if (startRange.target !== startControl || startRange.startOffset !== startOffset || endRange.target !== endControl || endRange.endOffset !== endOffset) {
250
- selectionState.clear();
251
- const ssRange = new SelectionRange();
252
- ssRange.setStart(startRange.target, startRange.startOffset);
253
- ssRange.setEnd(endRange.target, endRange.endOffset);
254
- selectionState.addRange(ssRange);
255
- return true;
256
- }
257
- return false;
258
- }
259
- static getStartRangeTarget(parentRange) {
260
- if (parentRange.target instanceof LeafElement) {
261
- return parentRange;
262
- }
263
- else {
264
- for (let i = 0; i < parentRange.selectedChildren.length; i++) {
265
- const res = this.getStartRangeTarget(parentRange.selectedChildren[i]);
266
- if (res) {
267
- return res;
268
- }
269
- }
270
- }
271
- return null;
272
- }
273
- static getEndRangeTarget(parentRange) {
274
- if (parentRange.target instanceof LeafElement) {
275
- return parentRange;
276
- }
277
- else {
278
- for (let i = parentRange.selectedChildren.length - 1; i >= 0; i--) {
279
- const res = this.getEndRangeTarget(parentRange.selectedChildren[i]);
280
- if (res) {
281
- return res;
282
- }
283
- }
284
- }
285
- return null;
286
- }
287
- /**
288
- * 循环递归执行选区对象方法
289
- * @param range
290
- * @param handler
291
- */
292
- static recursionTraversalRangeHandler(range, handler) {
293
- handler(range);
294
- for (let i = 0; i < range.selectedChildren.length; i++) {
295
- this.recursionTraversalRangeHandler(range.selectedChildren[i], handler);
296
- }
297
- }
298
- /**
299
- * 判断元素是否被完全选中
300
- * @param range
301
- */
302
- static checkElementFullInRange(range, ele) {
303
- let res = false;
304
- this.recursionTraversalRangeHandler(range, (childRange) => {
305
- if (childRange.target === ele && childRange.isFullSelected) {
306
- res = true;
307
- }
308
- });
309
- return res;
310
- }
311
- }
312
- //# sourceMappingURL=range-util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"range-util.js","sourceRoot":"lib/","sources":["framework/range-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { BranchElement, Element, LeafElement, SelectionContentRange } from \"./element-define\";\nimport { ElementUtil } from \"./element-util\";\nimport { TableCellElement } from \"./impl/table/table-cell-impl\";\nimport { TableElement } from \"./impl/table/table-impl\";\nimport { TableRowElement } from \"./impl/table/table-row-impl\";\nimport { SelectionRange, SelectionState } from './document-selection'\nimport { TextGroupElement } from \"./impl/text/text-impl\";\n\n\nexport class RangeUtil {\n\n static getSelctionRange(startControl: LeafElement, startOffset: number, endControl: LeafElement, endOffset: number, ancestorCommonControl: BranchElement): SelectionContentRange {\n if (ancestorCommonControl instanceof TableElement || ancestorCommonControl instanceof TableRowElement) {\n const tbElement = ancestorCommonControl instanceof TableElement ? ancestorCommonControl : ancestorCommonControl.parent as TableElement;\n return this.getTableSelectionRange(startControl, startOffset, endControl, endOffset, tbElement);\n }\n if (startControl === endControl && startControl.parent === ancestorCommonControl) {\n return this.getCollapsedRange(startControl, startOffset, endOffset, ancestorCommonControl);\n }\n const startRange = this.getStartForbackTreeData(startControl, ancestorCommonControl, null, startOffset).selectedChildren[0];\n const endRange = this.getEndForwardTreeData(endControl, ancestorCommonControl, null, endOffset).selectedChildren[0];\n const startIndex = ancestorCommonControl.getChildIndex(startRange.target);\n const endIndex = ancestorCommonControl.getChildIndex(endRange.target);\n const commonRange = this.getChildTreeData(ancestorCommonControl, startIndex + 1, endIndex);\n if (this.rangeEquals(startRange, endRange)) {\n commonRange.selectedChildren.unshift(startRange);\n } else {\n commonRange.selectedChildren.unshift(startRange);\n commonRange.selectedChildren.push(endRange);\n }\n this.setRangeFullSelected(commonRange);\n return commonRange;\n }\n\n static getCollapsedRange(startControl: LeafElement, startOffset: number, endOffset: number, ancestorCommonControl: BranchElement): SelectionContentRange {\n const range = {\n target: ancestorCommonControl,\n isFullSelected: false,\n startOffset: startControl.getIndex(),\n endOffset: startControl.getIndex() + 1,\n selectedChildren: [this.getChildTreeData(startControl, startOffset, endOffset)]\n }\n this.setRangeFullSelected(range);\n return range;\n\n }\n\n /**\n * 获取表格选区的内容\n * @param startControl \n * @param startOffset \n * @param endControl \n * @param endOffset \n * @param tb \n */\n static getTableSelectionRange(startControl: LeafElement, startOffset: number, endControl: LeafElement, endOffset: number, tb: TableElement): SelectionContentRange {\n const startCell = ElementUtil.getParentByType(startControl, TableCellElement);\n const endCell = ElementUtil.getParentByType(endControl, TableCellElement);\n if (startCell && endCell && startCell.parent.parent === tb && endCell.parent.parent === tb) {\n let startRowIndex = startCell.parent.getIndex();\n let endRowIndex = endCell.parent.getIndex();\n let startColIndex = startCell.getIndex();\n let endColIndex = endCell.getIndex();\n if (startColIndex > endColIndex) {\n [startColIndex, endColIndex] = [endColIndex, startColIndex];\n }\n if (startRowIndex > endRowIndex) {\n [startRowIndex, endRowIndex] = [endRowIndex, startRowIndex];\n }\n const region = { startRow: startRowIndex, endRow: endRowIndex, startCol: startColIndex, endCol: endColIndex };//this.getTableRectSelectedRegion(tb, { startRow: startRowIndex, endRow: endRowIndex, startCol: startColIndex, endCol: endColIndex });\n startRowIndex = region.startRow;\n endRowIndex = region.endRow;\n startColIndex = region.startCol;\n endColIndex = region.endCol;\n const rowRanges: Array<SelectionContentRange> = [];\n for (let i = startRowIndex; i <= endRowIndex; i++) {\n const cellRanges: Array<SelectionContentRange> = [];\n const row = tb.getChild(i) as TableRowElement;\n for (let j = startColIndex; j <= endColIndex; j++) {\n const cell = row.getChild(j) as TableCellElement;\n const cellFirstLeafElement = ElementUtil.getFirstLeafElement(cell) as LeafElement;\n const cellLastLeafElement = ElementUtil.getLastLeafElement(cell) as LeafElement;\n if (!cellFirstLeafElement && !cell.isNotBeMergedCell()) {\n cellRanges.push({\n target: cell,\n isFullSelected: true,\n startOffset: 0,\n endOffset: 1,\n selectedChildren: []\n });\n } else {\n const cellRange = this.getSelctionRange(cellFirstLeafElement, 0, cellLastLeafElement, 1, cell);\n cellRanges.push(cellRange);\n }\n }\n const rowRange: SelectionContentRange = {\n target: row,\n isFullSelected: false,\n startOffset: startColIndex,\n endOffset: endColIndex,\n selectedChildren: [...cellRanges]\n };\n rowRange.isFullSelected = startColIndex === 0 && endColIndex === row.length - 1;\n rowRanges.push(rowRange);\n }\n const tableRange: SelectionContentRange = {\n target: tb,\n isFullSelected: false,\n startOffset: startRowIndex,\n endOffset: endRowIndex,\n selectedChildren: [...rowRanges]\n };\n tableRange.isFullSelected = startRowIndex === 0 && endRowIndex === tb.length - 1 && tableRange.selectedChildren.every(item => item.isFullSelected);\n return tableRange;\n } else {\n throw new Error('当前单元格和表格不对应');\n }\n }\n\n\n\n private static getStartForbackTreeData(control: Element, ancestorCommonControl: BranchElement, childData: SelectionContentRange | null, offset: number): SelectionContentRange {\n if (!control) {\n debugger;\n }\n const parent = control.parent;\n if (parent !== ancestorCommonControl) {\n const range = this.getChildTreeData(parent, parent.getChildIndex(control) + 1, -1);\n if (childData) {\n range.selectedChildren.unshift(childData);\n } else {\n range.selectedChildren.unshift(this.getChildTreeData(control, offset, -1));\n }\n this.setRangeFullSelected(range);\n return this.getStartForbackTreeData(parent, ancestorCommonControl, range, -99);\n } else {\n const ancestorRange: SelectionContentRange = {\n target: ancestorCommonControl,\n startOffset: -1,\n endOffset: -1,\n isFullSelected: false,\n selectedChildren: []\n };\n if (!childData) {\n childData = this.getChildTreeData(control, offset, -1);\n }\n ancestorRange.selectedChildren.push(childData);\n this.setRangeFullSelected(ancestorRange);\n return ancestorRange;\n }\n }\n\n\n\n private static getEndForwardTreeData(control: Element, ancestorCommonControl: BranchElement, childData: SelectionContentRange | null, offset: number): SelectionContentRange {\n const parent = control.parent;\n if (parent !== ancestorCommonControl) {\n const range = this.getChildTreeData(parent, 0, parent.getChildIndex(control));\n if (childData) {\n range.selectedChildren.push(childData);\n } else {\n range.selectedChildren.push(this.getChildTreeData(control, 0, offset));\n }\n this.setRangeFullSelected(range);\n return this.getEndForwardTreeData(parent, ancestorCommonControl, range, -99);\n } else {\n const ancestorRange: SelectionContentRange = {\n target: ancestorCommonControl,\n startOffset: 0,\n endOffset: 0,\n isFullSelected: false,\n selectedChildren: []\n };\n if (!childData) {\n childData = this.getChildTreeData(control, 0, offset)\n }\n ancestorRange.selectedChildren.push(childData);\n this.setRangeFullSelected(ancestorRange);\n return ancestorRange;\n }\n }\n\n private static getChildTreeData(control: Element, start: number, end: number): SelectionContentRange {\n const range: SelectionContentRange = {\n target: control,\n isFullSelected: false,\n startOffset: start,\n endOffset: end,\n selectedChildren: []\n };\n if (control instanceof LeafElement) {\n if (control instanceof TextGroupElement) {\n range.endOffset = end === -1 ? control.text.length : end;\n } else {\n range.endOffset = end === -1 ? 1 : end;\n }\n\n } else if (control instanceof BranchElement) {\n end = end === -1 ? control.length : end;\n for (let i = start; i < end; i++) {\n const child = control.getChild(i);\n range.selectedChildren.push(this.getChildTreeData(child, 0, -1));\n }\n }\n this.setRangeFullSelected(range);\n return range;\n }\n\n private static setRangeFullSelected(selectionRange: SelectionContentRange): void {\n if (selectionRange.target instanceof LeafElement) {\n const { startOffset, endOffset } = selectionRange;\n if (selectionRange.target instanceof TextGroupElement) {\n selectionRange.isFullSelected = startOffset === 0 && endOffset === selectionRange.target.text.length\n } else {\n selectionRange.isFullSelected = startOffset === 0 && endOffset === 1;\n }\n } else if (selectionRange.target instanceof BranchElement) {\n const parent = selectionRange.target;\n const selectedChildren = selectionRange.selectedChildren;\n //被合并的table-cell,内容为empty\n if (selectedChildren.length === 0) {\n if (selectionRange.startOffset === 0 && selectionRange.endOffset === -1) {\n selectionRange.isFullSelected = true;\n return;\n }\n selectionRange.isFullSelected = false;\n return;\n }\n const firstItem = selectedChildren[0];\n const firstItemIndex = parent.getChildIndex(firstItem.target);\n const lastItem = selectedChildren[selectedChildren.length - 1];\n const lastItemIndex = parent.getChildIndex(lastItem.target);\n selectionRange.startOffset = firstItemIndex;\n selectionRange.endOffset = lastItemIndex;\n selectionRange.isFullSelected = firstItemIndex === 0 && firstItem.isFullSelected && lastItemIndex === parent.length - 1 && lastItem.isFullSelected;\n }\n }\n\n static rangeEquals(selRange1: SelectionContentRange, selRange2: SelectionContentRange): boolean {\n return selRange1.target === selRange2.target && selRange1.startOffset === selRange2.startOffset && selRange1.endOffset === selRange2.endOffset;\n }\n\n\n /**\n * 根据选区范围更正选区内容状态\n * @param selectedRange \n * @param selectionState \n */\n static fixSelectionStateByRange(selectionState: SelectionState): boolean {\n const { startControl, startOffset, endControl, endOffset, selectedRange } = selectionState;\n if (!selectedRange || !startControl) {\n return false;\n }\n const startRange = this.getStartRangeTarget(selectedRange) as SelectionContentRange;\n const endRange = this.getEndRangeTarget(selectedRange) as SelectionContentRange;\n if (startRange.target !== startControl || startRange.startOffset !== startOffset || endRange.target !== endControl || endRange.endOffset !== endOffset) {\n selectionState.clear();\n const ssRange = new SelectionRange();\n ssRange.setStart(startRange.target, startRange.startOffset);\n ssRange.setEnd(endRange.target, endRange.endOffset);\n selectionState.addRange(ssRange);\n return true;\n }\n return false;\n }\n\n static getStartRangeTarget(parentRange: SelectionContentRange): SelectionContentRange | null {\n if (parentRange.target instanceof LeafElement) {\n return parentRange;\n } else {\n for (let i = 0; i < parentRange.selectedChildren.length; i++) {\n const res = this.getStartRangeTarget(parentRange.selectedChildren[i]);\n if (res) {\n return res;\n }\n }\n }\n return null;\n }\n\n static getEndRangeTarget(parentRange: SelectionContentRange): SelectionContentRange | null {\n if (parentRange.target instanceof LeafElement) {\n return parentRange;\n } else {\n for (let i = parentRange.selectedChildren.length - 1; i >= 0; i--) {\n const res = this.getEndRangeTarget(parentRange.selectedChildren[i]);\n if (res) {\n return res;\n }\n }\n }\n return null;\n }\n\n /**\n * 循环递归执行选区对象方法\n * @param range \n * @param handler \n */\n static recursionTraversalRangeHandler(range: SelectionContentRange, handler: (range: SelectionContentRange) => void): void {\n handler(range);\n for (let i = 0; i < range.selectedChildren.length; i++) {\n this.recursionTraversalRangeHandler(range.selectedChildren[i], handler);\n }\n }\n\n /**\n * 判断元素是否被完全选中\n * @param range \n */\n static checkElementFullInRange(range: SelectionContentRange, ele: Element): boolean {\n let res = false;\n this.recursionTraversalRangeHandler(range, (childRange) => {\n if (childRange.target === ele && childRange.isFullSelected) {\n res = true;\n }\n });\n return res;\n }\n\n}"]}