@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,358 +0,0 @@
1
- import { Subject } from "rxjs";
2
- import { BranchElement, LeafElement } from "./element-define";
3
- import { ElementUtil } from "./element-util";
4
- import { DocumentContainerRender } from "./impl/document/doc-container-impl";
5
- import { DocumentRenderObject } from "./impl/document/doc-impl";
6
- import { TextGroupElement } from "./impl/text/text-impl";
7
- import { DocumentBodyElement } from "./impl/document/doc-body-impl";
8
- export class DocumentSelection {
9
- constructor() {
10
- this.selectionState = new SelectionState();
11
- }
12
- selectionState;
13
- snapshotSelectionState;
14
- setSelectionState(hitInfo) {
15
- const { startHitInfo, endHitInfo } = hitInfo;
16
- this.selectionState.clear();
17
- this.selectionState.startHitInfo = startHitInfo;
18
- if (!startHitInfo) {
19
- return;
20
- }
21
- const startRange = new SelectionRange();
22
- startRange.setStart(startHitInfo.element, startHitInfo.offset);
23
- if (endHitInfo) {
24
- startRange.setEnd(endHitInfo.element, endHitInfo.offset);
25
- }
26
- else {
27
- startRange.setEnd(startHitInfo.element, startHitInfo.offset);
28
- }
29
- this.selectionState.addRange(startRange);
30
- }
31
- /**
32
- * 获取选区共同的祖先控件
33
- */
34
- static getAncestorCommonControl(startControl, endControl) {
35
- const startNestParents = this.getNestParents(startControl.parent);
36
- const ancestorCommonControl = this.getCommonParenet(endControl.parent, startNestParents);
37
- if (!ancestorCommonControl) {
38
- throw new Error('未找到公共的祖先组件');
39
- }
40
- return ancestorCommonControl;
41
- }
42
- /**
43
- * 获取向上的嵌套父级节点集合
44
- * @param control
45
- * @param array
46
- */
47
- static getNestParents(control) {
48
- if (control) {
49
- return [control, ...this.getNestParents(control.parent)];
50
- }
51
- return [];
52
- }
53
- static getCommonParenet(control, array) {
54
- if (!control) {
55
- return null;
56
- }
57
- if (array.some(item => item === control)) {
58
- return control;
59
- }
60
- return this.getCommonParenet(control?.parent, array);
61
- }
62
- updateSelectionState() {
63
- if (this.compareSelectionEquals()) {
64
- return false;
65
- }
66
- const range = this.selectionState.range;
67
- this.transformRange();
68
- if (!range) {
69
- return false;
70
- }
71
- const startControlIndex = ElementUtil.getControlIndex(range.startControl);
72
- const endControlIndex = ElementUtil.getControlIndex(range.endControl);
73
- if (endControlIndex < startControlIndex) {
74
- const clone = range.clone();
75
- clone.startControl = range.endControl;
76
- clone.startOffset = range.endOffset;
77
- clone.endControl = range.startControl;
78
- clone.endOffset = range.startOffset;
79
- clone.editable = range.editable;
80
- this.selectionState.addRange(clone);
81
- }
82
- this.selectionState.editable = range.editable;
83
- this.selectionState.startControl = range.startControl;
84
- this.selectionState.startOffset = range.startOffset;
85
- this.selectionState.startControlIndex = ElementUtil.getControlIndex(range.startControl);
86
- this.selectionState.endControl = range.endControl;
87
- this.selectionState.endOffset = range.endOffset;
88
- this.selectionState.endControlIndex = ElementUtil.getControlIndex(range.endControl);
89
- this.selectionState.ancestorCommonControl = DocumentSelection.getAncestorCommonControl(this.selectionState.startControl, this.selectionState.endControl);
90
- this.selectionState.enableTrackChanges = this.getEnableTrackChanges(range.startControl);
91
- return true;
92
- }
93
- /**
94
- * 获取当前选区区域内是否支持留痕
95
- * @private
96
- */
97
- getEnableTrackChanges(ele) {
98
- const body = ElementUtil.getParentByType(ele, DocumentBodyElement);
99
- return body?.trackChanges || false;
100
- }
101
- compareSelectionEquals() {
102
- const range = this.selectionState.range;
103
- const snap = this.snapshotSelectionState;
104
- if (snap && range) {
105
- return range.startControl === snap.startControl
106
- && range.startOffset === snap.startOffset
107
- && range.endControl === snap.endControl
108
- && range.endOffset === snap.endOffset;
109
- }
110
- return false;
111
- }
112
- /**
113
- * 转换选区内容
114
- * 处理结束选区在开始选区之前
115
- */
116
- transformRange() {
117
- let range = this.selectionState.range;
118
- if (!range) {
119
- return;
120
- }
121
- const { startControl, startOffset, endControl, endOffset } = range;
122
- const startControlIndex = ElementUtil.getControlIndex(startControl);
123
- const endControlIndex = ElementUtil.getControlIndex(endControl);
124
- if ((endControlIndex < startControlIndex)) {
125
- const clone = range.clone();
126
- clone.startControl = endControl;
127
- clone.startOffset = endOffset;
128
- clone.endControl = startControl;
129
- clone.endOffset = startOffset;
130
- this.selectionState.addRange(clone);
131
- }
132
- range = this.selectionState.range;
133
- if (!range) {
134
- throw new Error('range is null');
135
- }
136
- range.calcRange();
137
- if ((range.startControl === range.endControl && range.startOffset > range.endOffset)) {
138
- const { startOffset, endOffset } = range;
139
- range.startOffset = endOffset;
140
- range.endOffset = startOffset;
141
- }
142
- range.calcRange();
143
- }
144
- takeSnapshot() {
145
- this.snapshotSelectionState = this.selectionState.clone();
146
- }
147
- clearSnapshot() {
148
- this.snapshotSelectionState = null;
149
- }
150
- }
151
- export class SelectionState {
152
- get startControl() {
153
- return this._startControl;
154
- }
155
- set startControl(value) {
156
- this._startControl = value;
157
- }
158
- get endControl() {
159
- return this._endControl;
160
- }
161
- set endControl(value) {
162
- this._endControl = value;
163
- }
164
- onChangedEvent = new Subject();
165
- startControlIndex;
166
- startOffset;
167
- endControlIndex;
168
- endOffset;
169
- get collapsed() {
170
- const { startControlIndex, startOffset, endControlIndex, endOffset } = this;
171
- return !(startControlIndex !== endControlIndex || (startControlIndex === endControlIndex && startOffset !== endOffset));
172
- }
173
- _startControl;
174
- _endControl;
175
- ancestorCommonControl;
176
- range;
177
- startHitInfo;
178
- selectedRange;
179
- editable = true;
180
- renderContainer;
181
- cursorPos;
182
- //选区重新计算,触发函数
183
- afterSelectionChanged = null;
184
- //当前选区的上下文是否支持留痕修改
185
- enableTrackChanges = false;
186
- constructor() {
187
- this.clear();
188
- }
189
- clear() {
190
- this.range = null;
191
- this.startOffset = -1;
192
- this.endOffset = -1;
193
- this._startControl = null;
194
- this._endControl = null;
195
- this.ancestorCommonControl = null;
196
- this.startControlIndex = -1;
197
- this.endControlIndex = -1;
198
- this.selectedRange = null;
199
- this.cursorPos = null;
200
- }
201
- addRange(range) {
202
- this.clear();
203
- this.range = range;
204
- this.onChangedEvent.next();
205
- }
206
- resetRange(startControl, startOffset) {
207
- const range = new SelectionRange();
208
- range.setStart(startControl, startOffset);
209
- range.setEnd(startControl, startOffset);
210
- this.addRange(range);
211
- return range;
212
- }
213
- surround(ele) {
214
- const range = new SelectionRange();
215
- range.setStart(ele, 0);
216
- range.setEnd(ele, -1);
217
- this.addRange(range);
218
- }
219
- clone() {
220
- const clone = new SelectionState();
221
- clone._startControl = this._startControl;
222
- clone.startOffset = this.startOffset;
223
- clone._endControl = this._endControl;
224
- clone.endOffset = this.endOffset;
225
- clone.ancestorCommonControl = this.ancestorCommonControl;
226
- clone.startControlIndex = this.startControlIndex;
227
- clone.endControlIndex = this.endControlIndex;
228
- clone.selectedRange = this.selectedRange;
229
- return clone;
230
- }
231
- }
232
- export class SelectionRange {
233
- startControl;
234
- startOffset;
235
- endControl;
236
- endOffset;
237
- editable = true;
238
- setStart(control, offset) {
239
- this.startControl = control;
240
- this.startOffset = offset;
241
- }
242
- setEnd(control, offset) {
243
- this.endControl = control;
244
- this.endOffset = offset;
245
- }
246
- calcStart() {
247
- const res = this.setInfo(this.startControl, this.startOffset);
248
- this.setStart(res.control, res.offset);
249
- }
250
- calcEnd() {
251
- const res = this.setInfo(this.endControl, this.endOffset);
252
- this.setEnd(res.control, res.offset);
253
- }
254
- calcRange() {
255
- this.calcStart();
256
- this.calcEnd();
257
- }
258
- setInfo(control, offset) {
259
- if (control instanceof LeafElement) {
260
- if (control instanceof TextGroupElement) {
261
- offset = offset === -1 ? control.text.length : offset;
262
- }
263
- offset = offset === -1 ? 1 : offset;
264
- return { control, offset };
265
- }
266
- else if (control instanceof BranchElement) {
267
- if (offset > control.length) {
268
- throw new Error('超索引');
269
- }
270
- if (offset === control.length) {
271
- const child = control.getChild(offset - 1);
272
- return this.setInfo(child, 1);
273
- }
274
- else if (offset === -1) {
275
- const child = control.getChild(control.length - 1);
276
- return this.setInfo(child, -1);
277
- }
278
- else {
279
- const child = control.getChild(offset);
280
- return this.setInfo(child, 0);
281
- }
282
- }
283
- else {
284
- throw new Error('未实现');
285
- }
286
- }
287
- clone() {
288
- const clone = new SelectionRange();
289
- clone.startControl = this.startControl;
290
- clone.startOffset = this.startOffset;
291
- clone.endControl = this.endControl;
292
- clone.endOffset = this.endOffset;
293
- return clone;
294
- }
295
- }
296
- export class DocumentCursor {
297
- static getElementCursorPos(ele, offset, hitRegion, docNum) {
298
- if (hitRegion === 'body' || hitRegion === 'review') {
299
- return this.getElementRenderPos(ele, offset, ele.paintRenders);
300
- }
301
- else if (hitRegion === 'footer' || hitRegion === 'header') {
302
- const docContainer = ElementUtil.getParentRender(ele.paintRenders[0], DocumentContainerRender);
303
- if (!docContainer) {
304
- throw new Error('docContainer is null');
305
- }
306
- const docRender = docContainer.getChild(docNum);
307
- const currDocPaintRenders = ele.paintRenders.filter(item => ElementUtil.getParentRender(item, DocumentRenderObject) === docRender);
308
- return this.getElementRenderPos(ele, offset, currDocPaintRenders);
309
- }
310
- debugger;
311
- throw new Error('未找到元素偏移量对应的光标位置');
312
- }
313
- static getElementRenderPos(ele, offset, paints) {
314
- if (ele instanceof TextGroupElement) {
315
- let count = 0;
316
- for (let i = 0; i < paints.length; i++) {
317
- const paintRender = paints[i];
318
- let horX = 0;
319
- if (paintRender.textMeasures.length + count < offset) {
320
- count += paintRender.textMeasures.length;
321
- continue;
322
- }
323
- for (let i = 0; i <= paintRender.textMeasures.length; i++) {
324
- if (count === offset || (i === 0 && count + 0.5 === offset)) {
325
- const rect = ElementUtil.getRenderAbsolutePaintRect(paintRender, { x: 0, y: 0 });
326
- //上标、下标位置处理
327
- if (['superscript', 'subscript'].indexOf(ele.props.vertAlign) >= 0) {
328
- rect.height -= ele.props.fontSize / 2;
329
- if (ele.props.vertAlign === 'subscript') {
330
- rect.y += rect.height;
331
- }
332
- }
333
- rect.x += horX;
334
- return {
335
- render: paintRender,
336
- rect
337
- };
338
- }
339
- count++;
340
- horX += paintRender.textMeasures[i].actualSize;
341
- }
342
- }
343
- }
344
- else {
345
- const paintRender = paints[0];
346
- const rect = ElementUtil.getRenderAbsolutePaintRect(paintRender, { x: 0, y: 0 });
347
- if (offset === 1) {
348
- rect.x += rect.width;
349
- }
350
- return {
351
- render: paintRender,
352
- rect
353
- };
354
- }
355
- throw new Error('未能定位到元素位置');
356
- }
357
- }
358
- //# sourceMappingURL=document-selection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-selection.js","sourceRoot":"lib/","sources":["framework/document-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import { Subject } from \"rxjs\";\nimport { BranchElement, LeafElement, Rect, Element, SelectionContentRange, Position } from \"./element-define\";\nimport { HitEventInfo, HitRegion } from \"./element-event-define\";\nimport { ElementUtil } from \"./element-util\";\nimport { DocumentContainerRender } from \"./impl/document/doc-container-impl\";\nimport { DocumentRenderObject } from \"./impl/document/doc-impl\";\nimport { TextGroupElement, TextGroupRenderObject } from \"./impl/text/text-impl\";\nimport { RenderObject } from \"./render-define\";\nimport { DocumentBodyElement } from \"./impl/document/doc-body-impl\";\n\nexport class DocumentSelection {\n constructor() {\n this.selectionState = new SelectionState();\n }\n\n selectionState: SelectionState;\n snapshotSelectionState!: SelectionState | null;\n setSelectionState(hitInfo: { startHitInfo: HitEventInfo, endHitInfo: HitEventInfo }): void {\n const { startHitInfo, endHitInfo } = hitInfo;\n this.selectionState.clear();\n this.selectionState.startHitInfo = startHitInfo;\n if (!startHitInfo) {\n return;\n }\n const startRange = new SelectionRange();\n startRange.setStart(startHitInfo.element, startHitInfo.offset);\n if (endHitInfo) {\n startRange.setEnd(endHitInfo.element, endHitInfo.offset);\n } else {\n startRange.setEnd(startHitInfo.element, startHitInfo.offset);\n }\n this.selectionState.addRange(startRange);\n }\n\n /**\n * 获取选区共同的祖先控件\n */\n static getAncestorCommonControl(startControl: LeafElement, endControl: LeafElement): BranchElement {\n const startNestParents = this.getNestParents(startControl.parent);\n const ancestorCommonControl = this.getCommonParenet(endControl.parent, startNestParents);\n if (!ancestorCommonControl) {\n throw new Error('未找到公共的祖先组件');\n }\n return ancestorCommonControl;\n }\n\n /**\n * 获取向上的嵌套父级节点集合\n * @param control \n * @param array \n */\n static getNestParents(control: BranchElement | null): Array<BranchElement> {\n if (control) {\n return [control, ...this.getNestParents(control.parent)];\n }\n return [];\n\n }\n\n static getCommonParenet(control: BranchElement | null, array: Array<BranchElement>): BranchElement | null {\n if (!control) {\n return null;\n }\n if (array.some(item => item === control)) {\n return control;\n }\n return this.getCommonParenet(control?.parent, array);\n }\n\n updateSelectionState(): boolean {\n if (this.compareSelectionEquals()) {\n return false;\n }\n const range = this.selectionState.range;\n this.transformRange();\n if (!range) {\n return false;\n }\n const startControlIndex = ElementUtil.getControlIndex(range.startControl);\n const endControlIndex = ElementUtil.getControlIndex(range.endControl);\n if (endControlIndex < startControlIndex) {\n const clone = range.clone();\n clone.startControl = range.endControl;\n clone.startOffset = range.endOffset;\n clone.endControl = range.startControl;\n clone.endOffset = range.startOffset;\n clone.editable = range.editable;\n this.selectionState.addRange(clone);\n }\n this.selectionState.editable = range.editable;\n\n this.selectionState.startControl = range.startControl as LeafElement;\n this.selectionState.startOffset = range.startOffset;\n this.selectionState.startControlIndex = ElementUtil.getControlIndex(range.startControl);\n\n this.selectionState.endControl = range.endControl as LeafElement;\n this.selectionState.endOffset = range.endOffset;\n this.selectionState.endControlIndex = ElementUtil.getControlIndex(range.endControl);\n\n this.selectionState.ancestorCommonControl = DocumentSelection.getAncestorCommonControl(this.selectionState.startControl, this.selectionState.endControl);\n\n this.selectionState.enableTrackChanges = this.getEnableTrackChanges(range.startControl);\n return true;\n }\n\n /**\n * 获取当前选区区域内是否支持留痕\n * @private\n */\n private getEnableTrackChanges(ele: Element): boolean {\n const body = ElementUtil.getParentByType(ele, DocumentBodyElement);\n return body?.trackChanges || false;\n }\n\n private compareSelectionEquals(): boolean {\n const range = this.selectionState.range;\n const snap = this.snapshotSelectionState;\n if (snap && range) {\n return range.startControl === snap.startControl\n && range.startOffset === snap.startOffset\n && range.endControl === snap.endControl\n && range.endOffset === snap.endOffset;\n }\n return false;\n }\n\n /**\n * 转换选区内容\n * 处理结束选区在开始选区之前\n */\n private transformRange(): void {\n let range = this.selectionState.range;\n if (!range) {\n return;\n }\n const { startControl, startOffset, endControl, endOffset } = range;\n const startControlIndex = ElementUtil.getControlIndex(startControl);\n const endControlIndex = ElementUtil.getControlIndex(endControl);\n if ((endControlIndex < startControlIndex)) {\n const clone = range.clone();\n clone.startControl = endControl;\n clone.startOffset = endOffset;\n clone.endControl = startControl;\n clone.endOffset = startOffset;\n this.selectionState.addRange(clone);\n }\n range = this.selectionState.range;\n if (!range) {\n throw new Error('range is null')\n }\n range.calcRange();\n if ((range.startControl === range.endControl && range.startOffset > range.endOffset)) {\n const { startOffset, endOffset } = range;\n range.startOffset = endOffset;\n range.endOffset = startOffset;\n }\n range.calcRange();\n }\n\n takeSnapshot(): void {\n this.snapshotSelectionState = this.selectionState.clone();\n }\n\n clearSnapshot(): void {\n this.snapshotSelectionState = null;\n }\n\n}\n\nexport class SelectionState {\n get startControl(): LeafElement {\n return this._startControl as LeafElement;\n }\n\n set startControl(value: LeafElement | null) {\n this._startControl = value;\n }\n\n get endControl(): LeafElement {\n return this._endControl as LeafElement;\n }\n\n set endControl(value: LeafElement | null) {\n this._endControl = value;\n }\n onChangedEvent: Subject<void> = new Subject();\n startControlIndex!: number;\n startOffset!: number;\n endControlIndex!: number;\n endOffset!: number;\n get collapsed() {\n const { startControlIndex, startOffset, endControlIndex, endOffset } = this;\n return !(startControlIndex !== endControlIndex || (startControlIndex === endControlIndex && startOffset !== endOffset));\n }\n private _startControl!: LeafElement | null;\n private _endControl!: LeafElement | null;\n ancestorCommonControl!: BranchElement | null;\n range!: SelectionRange | null;\n startHitInfo!: HitEventInfo | null;\n selectedRange!: SelectionContentRange | null;\n editable: boolean = true;\n renderContainer!: DocumentContainerRender;\n cursorPos!: Rect | null;\n //选区重新计算,触发函数\n afterSelectionChanged: ((newVal: SelectionState) => boolean) | null = null;\n //当前选区的上下文是否支持留痕修改\n enableTrackChanges: boolean = false;\n constructor() {\n this.clear();\n }\n clear(): void {\n this.range = null;\n this.startOffset = -1;\n this.endOffset = -1;\n this._startControl = null;\n this._endControl = null;\n this.ancestorCommonControl = null;\n this.startControlIndex = -1;\n this.endControlIndex = -1;\n this.selectedRange = null;\n this.cursorPos = null;\n }\n\n addRange(range: SelectionRange): void {\n this.clear();\n this.range = range;\n this.onChangedEvent.next();\n }\n resetRange(startControl: Element, startOffset: number): SelectionRange {\n const range = new SelectionRange();\n range.setStart(startControl, startOffset);\n range.setEnd(startControl, startOffset);\n this.addRange(range);\n return range;\n }\n\n surround(ele: Element): void {\n const range = new SelectionRange();\n range.setStart(ele, 0);\n range.setEnd(ele, -1);\n this.addRange(range);\n }\n\n clone(): SelectionState {\n const clone = new SelectionState();\n clone._startControl = this._startControl;\n clone.startOffset = this.startOffset;\n clone._endControl = this._endControl;\n clone.endOffset = this.endOffset;\n clone.ancestorCommonControl = this.ancestorCommonControl;\n clone.startControlIndex = this.startControlIndex;\n clone.endControlIndex = this.endControlIndex;\n clone.selectedRange = this.selectedRange;\n return clone;\n }\n\n\n}\n\n\n\nexport class SelectionRange {\n startControl!: Element;\n startOffset!: number;\n endControl!: Element;\n endOffset!: number;\n editable: boolean = true;\n setStart(control: Element, offset: number): void {\n this.startControl = control;\n this.startOffset = offset;\n }\n setEnd(control: Element, offset: number): void {\n this.endControl = control;\n this.endOffset = offset;\n }\n\n private calcStart(): void {\n const res = this.setInfo(this.startControl, this.startOffset);\n this.setStart(res.control, res.offset);\n }\n\n private calcEnd(): void {\n const res = this.setInfo(this.endControl, this.endOffset);\n this.setEnd(res.control, res.offset);\n }\n\n calcRange(): void {\n this.calcStart();\n this.calcEnd();\n }\n\n private setInfo(control: Element, offset: number): { control: LeafElement, offset: number } {\n if (control instanceof LeafElement) {\n if (control instanceof TextGroupElement) {\n offset = offset === -1 ? control.text.length : offset;\n }\n offset = offset === -1 ? 1 : offset;\n return { control, offset };\n } else if (control instanceof BranchElement) {\n if (offset > control.length) {\n throw new Error('超索引');\n }\n if (offset === control.length) {\n const child = control.getChild(offset - 1);\n return this.setInfo(child, 1);\n } else if (offset === -1) {\n const child = control.getChild(control.length - 1);\n return this.setInfo(child, -1);\n } else {\n const child = control.getChild(offset);\n return this.setInfo(child, 0);\n }\n } else {\n throw new Error('未实现');\n }\n }\n\n clone(): SelectionRange {\n const clone = new SelectionRange();\n clone.startControl = this.startControl;\n clone.startOffset = this.startOffset;\n clone.endControl = this.endControl;\n clone.endOffset = this.endOffset;\n return clone;\n }\n\n}\n\nexport class DocumentCursor {\n static getElementCursorPos(ele: LeafElement, offset: number, hitRegion: HitRegion | undefined, docNum: number): { render: RenderObject, rect: Rect } {\n if (hitRegion === 'body' || hitRegion === 'review') {\n return this.getElementRenderPos(ele, offset, ele.paintRenders);\n } else if (hitRegion === 'footer' || hitRegion === 'header') {\n const docContainer = ElementUtil.getParentRender(ele.paintRenders[0], DocumentContainerRender);\n if (!docContainer) {\n throw new Error('docContainer is null')\n }\n const docRender = docContainer.getChild(docNum) as DocumentRenderObject;\n const currDocPaintRenders = ele.paintRenders.filter(item => ElementUtil.getParentRender(item, DocumentRenderObject) === docRender);\n return this.getElementRenderPos(ele, offset, currDocPaintRenders);\n }\n debugger;\n throw new Error('未找到元素偏移量对应的光标位置')\n }\n\n private static getElementRenderPos(ele: LeafElement, offset: number, paints: Array<RenderObject>): { render: RenderObject, rect: Rect } {\n if (ele instanceof TextGroupElement) {\n let count = 0;\n for (let i = 0; i < paints.length; i++) {\n const paintRender = paints[i] as TextGroupRenderObject;\n let horX = 0;\n if (paintRender.textMeasures.length + count < offset) {\n count += paintRender.textMeasures.length;\n continue;\n }\n for (let i = 0; i <= paintRender.textMeasures.length; i++) {\n if (count === offset || (i === 0 && count + 0.5 === offset)) {\n const rect = ElementUtil.getRenderAbsolutePaintRect(paintRender, { x: 0, y: 0 })\n //上标、下标位置处理\n if (['superscript', 'subscript'].indexOf(ele.props.vertAlign) >= 0) {\n rect.height -= ele.props.fontSize / 2;\n if (ele.props.vertAlign === 'subscript') {\n rect.y += rect.height;\n }\n }\n rect.x += horX;\n return {\n render: paintRender,\n rect\n }\n }\n count++;\n horX += paintRender.textMeasures[i].actualSize;\n }\n }\n } else {\n const paintRender = paints[0];\n const rect = ElementUtil.getRenderAbsolutePaintRect(paintRender, { x: 0, y: 0 })\n if (offset === 1) {\n rect.x += rect.width;\n }\n return {\n render: paintRender,\n rect\n }\n }\n throw new Error('未能定位到元素位置')\n }\n}\n"]}
@@ -1,20 +0,0 @@
1
- import { PaddingProps } from "./element-define";
2
- import { DocumentProps } from "./element-props";
3
- import { DocumentBodyElement } from "./impl/document/doc-body-impl";
4
- import { DocumentFooterElement } from "./impl/document/doc-footer-impl";
5
- import { DocumentHeaderElement } from "./impl/document/doc-header-impl";
6
- import { DocumentElement } from "./impl/document/doc-impl";
7
- export class DocumentTemplate {
8
- static createA4Doc() {
9
- const doc = new DocumentElement();
10
- doc.props = new DocumentProps();
11
- doc.props.width = 210;
12
- doc.props.height = 297;
13
- doc.props.padding = new PaddingProps(25.4, 25.4, 19.1, 19.1);
14
- doc.addChild(new DocumentHeaderElement());
15
- doc.addChild(new DocumentBodyElement());
16
- doc.addChild(new DocumentFooterElement());
17
- return doc;
18
- }
19
- }
20
- //# sourceMappingURL=document-template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-template.js","sourceRoot":"lib/","sources":["framework/document-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,OAAO,gBAAgB;IACzB,MAAM,CAAC,WAAW;QACd,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QACvB,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,GAAG,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,QAAQ,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;QACxC,GAAG,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC;IACf,CAAC;CACJ","sourcesContent":["import { PaddingProps } from \"./element-define\";\nimport { DocumentProps } from \"./element-props\";\nimport { DocumentBodyElement } from \"./impl/document/doc-body-impl\";\nimport { DocumentFooterElement } from \"./impl/document/doc-footer-impl\";\nimport { DocumentHeaderElement } from \"./impl/document/doc-header-impl\";\nimport { DocumentElement } from \"./impl/document/doc-impl\";\n\nexport class DocumentTemplate {\n static createA4Doc(): DocumentElement {\n const doc = new DocumentElement();\n doc.props = new DocumentProps();\n doc.props.width = 210;\n doc.props.height = 297;\n doc.props.padding = new PaddingProps(25.4, 25.4, 19.1, 19.1);\n doc.addChild(new DocumentHeaderElement());\n doc.addChild(new DocumentBodyElement());\n doc.addChild(new DocumentFooterElement());\n return doc;\n }\n}"]}
@@ -1,30 +0,0 @@
1
- import { BranchElement } from "./element-define";
2
- import { ElementUtil } from "./element-util";
3
- import { TableElement, textLineRenderMode } from "./impl/table/table-impl";
4
- /**
5
- * 文字行渲染模式
6
- 用于医嘱打印模式
7
- */
8
- export function runTextLineRender(ele, options, renderCtx) {
9
- if (!options.textRowLineMode) {
10
- return;
11
- }
12
- if (ele instanceof TableElement) {
13
- textLineRenderMode(ele, options, renderCtx);
14
- remeasureParentRenders(ele.measureRender);
15
- return;
16
- }
17
- if (ele instanceof BranchElement) {
18
- for (let i = 0; i < ele.length; i++) {
19
- runTextLineRender(ele.getChild(i), options, renderCtx);
20
- }
21
- }
22
- }
23
- function remeasureParentRenders(render) {
24
- if (!render) {
25
- return;
26
- }
27
- ElementUtil.remeasure(render);
28
- remeasureParentRenders(render.parent);
29
- }
30
- //# sourceMappingURL=document-textline-mode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-textline-mode.js","sourceRoot":"lib/","sources":["framework/document-textline-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI3E;;;EAGE;AACF,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,OAAoB,EAAE,SAA6B;IAC/F,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;QAC1B,OAAO;KACV;IACD,IAAI,GAAG,YAAY,YAAY,EAAE;QAC7B,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5C,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACzC,OAAO;KACV;IACD,IAAI,GAAG,YAAY,aAAa,EAAE;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;SAC1D;KACJ;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA2B;IACvD,IAAI,CAAC,MAAM,EAAE;QACT,OAAM;KACT;IACD,WAAW,CAAC,SAAS,CAAC,MAAoC,CAAC,CAAA;IAC3D,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAEzC,CAAC","sourcesContent":["import { BranchElement, ViewOptions, Element } from \"./element-define\";\nimport { ElementUtil } from \"./element-util\";\nimport { TableElement, textLineRenderMode } from \"./impl/table/table-impl\";\nimport { RenderContenxtType } from \"./render-context\";\nimport { BlockContainerRenderObject, RenderObject } from \"./render-define\";\n\n/**\n* 文字行渲染模式\n用于医嘱打印模式\n*/\nexport function runTextLineRender(ele: Element, options: ViewOptions, renderCtx: RenderContenxtType): void {\n if (!options.textRowLineMode) {\n return;\n }\n if (ele instanceof TableElement) {\n textLineRenderMode(ele, options, renderCtx);\n remeasureParentRenders(ele.measureRender)\n return;\n }\n if (ele instanceof BranchElement) {\n for (let i = 0; i < ele.length; i++) {\n runTextLineRender(ele.getChild(i), options, renderCtx);\n }\n }\n}\n\nfunction remeasureParentRenders(render: RenderObject | null): void {\n if (!render) {\n return\n }\n ElementUtil.remeasure(render as BlockContainerRenderObject)\n remeasureParentRenders(render.parent)\n\n}"]}