@fluidframework/merge-tree 0.59.3000-66610 → 0.59.3000-67119
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.
- package/dist/client.d.ts +11 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +21 -1
- package/dist/client.js.map +1 -1
- package/dist/collections.d.ts +7 -1
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js +27 -1
- package/dist/collections.js.map +1 -1
- package/dist/localReference.d.ts +46 -8
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +92 -61
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +3 -0
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +28 -9
- package/dist/mergeTree.js.map +1 -1
- package/dist/referencePositions.d.ts +1 -0
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +8 -5
- package/dist/referencePositions.js.map +1 -1
- package/dist/snapshotlegacy.js +1 -1
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.js +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/textSegment.js +3 -2
- package/dist/textSegment.js.map +1 -1
- package/lib/client.d.ts +11 -2
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +21 -1
- package/lib/client.js.map +1 -1
- package/lib/collections.d.ts +7 -1
- package/lib/collections.d.ts.map +1 -1
- package/lib/collections.js +26 -1
- package/lib/collections.js.map +1 -1
- package/lib/localReference.d.ts +46 -8
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +93 -62
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +3 -0
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +29 -10
- package/lib/mergeTree.js.map +1 -1
- package/lib/referencePositions.d.ts +1 -0
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +6 -4
- package/lib/referencePositions.js.map +1 -1
- package/lib/snapshotlegacy.js +1 -1
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.js +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/textSegment.js +3 -2
- package/lib/textSegment.js.map +1 -1
- package/package.json +87 -9
- package/src/client.ts +27 -3
- package/src/collections.ts +29 -2
- package/src/localReference.ts +124 -67
- package/src/mergeTree.ts +36 -9
- package/src/referencePositions.ts +7 -3
- package/src/snapshotlegacy.ts +1 -1
- package/src/sortedSegmentSet.ts +1 -1
- package/src/textSegment.ts +2 -2
package/src/localReference.ts
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
import { assert } from "@fluidframework/common-utils";
|
|
7
7
|
import { Client } from "./client";
|
|
8
|
+
import { List, ListMakeHead, ListRemoveEntry } from "./collections";
|
|
8
9
|
import {
|
|
9
10
|
ISegment,
|
|
10
11
|
} from "./mergeTree";
|
|
11
12
|
import { ICombiningOp, ReferenceType } from "./ops";
|
|
12
13
|
import { addProperties, PropertySet } from "./properties";
|
|
13
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
minReferencePosition,
|
|
14
16
|
maxReferencePosition,
|
|
15
17
|
compareReferencePositions,
|
|
16
18
|
refHasTileLabels,
|
|
@@ -20,12 +22,13 @@ import { minReferencePosition,
|
|
|
20
22
|
refGetTileLabels,
|
|
21
23
|
refHasRangeLabel,
|
|
22
24
|
refHasTileLabel,
|
|
25
|
+
refTypeIncludesFlag,
|
|
23
26
|
} from "./referencePositions";
|
|
24
27
|
|
|
25
28
|
/**
|
|
26
29
|
* @deprecated - Use ReferencePosition
|
|
27
30
|
*/
|
|
28
|
-
|
|
31
|
+
export class LocalReference implements ReferencePosition {
|
|
29
32
|
/**
|
|
30
33
|
* @deprecated - use DetachedReferencePosition
|
|
31
34
|
*/
|
|
@@ -50,7 +53,7 @@ import { minReferencePosition,
|
|
|
50
53
|
/**
|
|
51
54
|
* @deprecated - use getOffset
|
|
52
55
|
*/
|
|
53
|
-
public offset = 0,
|
|
56
|
+
public offset: number = 0,
|
|
54
57
|
public refType = ReferenceType.Simple,
|
|
55
58
|
properties?: PropertySet,
|
|
56
59
|
) {
|
|
@@ -81,23 +84,19 @@ import { minReferencePosition,
|
|
|
81
84
|
* @deprecated - use getLocalReferencePosition
|
|
82
85
|
*/
|
|
83
86
|
public toPosition() {
|
|
84
|
-
|
|
85
|
-
return this.getOffset() + this.client.getPosition(this.segment);
|
|
86
|
-
} else {
|
|
87
|
-
return LocalReference.DetachedPosition;
|
|
88
|
-
}
|
|
87
|
+
return this.getClient().localReferencePositionToPosition(this);
|
|
89
88
|
}
|
|
90
89
|
|
|
91
90
|
/**
|
|
92
91
|
* @deprecated - use refHasTileLabels
|
|
93
92
|
*/
|
|
94
|
-
public hasTileLabels() {
|
|
93
|
+
public hasTileLabels(): boolean {
|
|
95
94
|
return refHasTileLabels(this);
|
|
96
95
|
}
|
|
97
96
|
/**
|
|
98
97
|
* @deprecated - use refHasRangeLabels
|
|
99
98
|
*/
|
|
100
|
-
public hasRangeLabels() {
|
|
99
|
+
public hasRangeLabels(): boolean {
|
|
101
100
|
return refHasRangeLabels(this);
|
|
102
101
|
}
|
|
103
102
|
/**
|
|
@@ -157,13 +156,17 @@ import { minReferencePosition,
|
|
|
157
156
|
}
|
|
158
157
|
|
|
159
158
|
interface IRefsAtOffset {
|
|
160
|
-
before?: LocalReference
|
|
161
|
-
at?: LocalReference
|
|
162
|
-
after?: LocalReference
|
|
159
|
+
before?: List<LocalReference>;
|
|
160
|
+
at?: List<LocalReference>;
|
|
161
|
+
after?: List<LocalReference>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function assertLocalReferences(lref: ReferencePosition | LocalReference): asserts lref is LocalReference {
|
|
165
|
+
assert(lref instanceof LocalReference, 0x2e0 /* "lref not a Local Reference" */);
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
/**
|
|
166
|
-
* Represents a collection of {@link
|
|
169
|
+
* Represents a collection of {@link ReferencePosition}s associated with one segment in a merge-tree.
|
|
167
170
|
*/
|
|
168
171
|
export class LocalReferenceCollection {
|
|
169
172
|
public static append(seg1: ISegment, seg2: ISegment) {
|
|
@@ -181,10 +184,18 @@ export class LocalReferenceCollection {
|
|
|
181
184
|
}
|
|
182
185
|
}
|
|
183
186
|
|
|
187
|
+
/**
|
|
188
|
+
*
|
|
189
|
+
* @internal - this method should only be called by mergeTree
|
|
190
|
+
*/
|
|
184
191
|
public hierRefCount: number = 0;
|
|
185
192
|
private readonly refsByOffset: (IRefsAtOffset | undefined)[];
|
|
186
193
|
private refCount: number = 0;
|
|
187
194
|
|
|
195
|
+
/**
|
|
196
|
+
*
|
|
197
|
+
* @internal - this method should only be called by mergeTree
|
|
198
|
+
*/
|
|
188
199
|
constructor(
|
|
189
200
|
/** Segment this `LocalReferenceCollection` is associated to. */
|
|
190
201
|
private readonly segment: ISegment,
|
|
@@ -195,6 +206,10 @@ export class LocalReferenceCollection {
|
|
|
195
206
|
this.refsByOffset = initialRefsByfOffset;
|
|
196
207
|
}
|
|
197
208
|
|
|
209
|
+
/**
|
|
210
|
+
*
|
|
211
|
+
* @internal - this method should only be called by mergeTree
|
|
212
|
+
*/
|
|
198
213
|
public [Symbol.iterator]() {
|
|
199
214
|
const subiterators: IterableIterator<LocalReference>[] = [];
|
|
200
215
|
for (const refs of this.refsByOffset) {
|
|
@@ -231,16 +246,20 @@ export class LocalReferenceCollection {
|
|
|
231
246
|
return iterator;
|
|
232
247
|
}
|
|
233
248
|
|
|
249
|
+
/**
|
|
250
|
+
*
|
|
251
|
+
* @internal - this method should only be called by mergeTree
|
|
252
|
+
*/
|
|
234
253
|
public clear() {
|
|
235
254
|
this.refCount = 0;
|
|
236
255
|
this.hierRefCount = 0;
|
|
237
|
-
const detachSegments = (refs: LocalReference
|
|
256
|
+
const detachSegments = (refs: List<LocalReference> | undefined) => {
|
|
238
257
|
if (refs) {
|
|
239
|
-
|
|
258
|
+
for (const r of refs) {
|
|
240
259
|
if (r.segment === this.segment) {
|
|
241
260
|
r.segment = undefined;
|
|
242
261
|
}
|
|
243
|
-
}
|
|
262
|
+
}
|
|
244
263
|
}
|
|
245
264
|
};
|
|
246
265
|
for (let i = 0; i < this.refsByOffset.length; i++) {
|
|
@@ -254,41 +273,80 @@ export class LocalReferenceCollection {
|
|
|
254
273
|
}
|
|
255
274
|
}
|
|
256
275
|
|
|
276
|
+
/**
|
|
277
|
+
*
|
|
278
|
+
* @internal - this method should only be called by mergeTree
|
|
279
|
+
*/
|
|
257
280
|
public get empty() {
|
|
258
281
|
return this.refCount === 0;
|
|
259
282
|
}
|
|
260
283
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
284
|
+
/**
|
|
285
|
+
*
|
|
286
|
+
* @internal - this method should only be called by mergeTree
|
|
287
|
+
*/
|
|
288
|
+
public createLocalRef(
|
|
289
|
+
offset: number,
|
|
290
|
+
refType: ReferenceType,
|
|
291
|
+
properties: PropertySet | undefined,
|
|
292
|
+
client: Client): ReferencePosition {
|
|
293
|
+
const ref = new LocalReference(
|
|
294
|
+
client,
|
|
295
|
+
this.segment,
|
|
296
|
+
offset,
|
|
297
|
+
refType,
|
|
298
|
+
properties,
|
|
299
|
+
);
|
|
300
|
+
if (!refTypeIncludesFlag(ref, ReferenceType.Transient)) {
|
|
301
|
+
this.addLocalRef(ref);
|
|
272
302
|
}
|
|
303
|
+
return ref;
|
|
304
|
+
}
|
|
273
305
|
|
|
274
|
-
|
|
306
|
+
/**
|
|
307
|
+
*
|
|
308
|
+
* @internal - this method should only be called by mergeTree
|
|
309
|
+
*/
|
|
310
|
+
public addLocalRef(lref: LocalReference | ReferencePosition) {
|
|
311
|
+
assert(
|
|
312
|
+
!refTypeIncludesFlag(lref, ReferenceType.Transient),
|
|
313
|
+
0x2df /* "transient references cannot be bound to segments" */);
|
|
314
|
+
assertLocalReferences(lref);
|
|
315
|
+
const refsAtOffset = this.refsByOffset[lref.getOffset()] =
|
|
316
|
+
this.refsByOffset[lref.getOffset()]
|
|
317
|
+
?? { at: ListMakeHead() };
|
|
318
|
+
const atRefs = refsAtOffset.at =
|
|
319
|
+
refsAtOffset.at
|
|
320
|
+
?? ListMakeHead();
|
|
321
|
+
|
|
322
|
+
atRefs.enqueue(lref);
|
|
323
|
+
|
|
324
|
+
if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
|
|
275
325
|
this.hierRefCount++;
|
|
276
326
|
}
|
|
277
327
|
this.refCount++;
|
|
278
328
|
}
|
|
279
329
|
|
|
280
|
-
|
|
281
|
-
|
|
330
|
+
/**
|
|
331
|
+
*
|
|
332
|
+
* @internal - this method should only be called by mergeTree
|
|
333
|
+
*/
|
|
334
|
+
public removeLocalRef(lref: LocalReference | ReferencePosition) {
|
|
335
|
+
assertLocalReferences(lref);
|
|
336
|
+
const tryRemoveRef = (refs: List<LocalReference> | undefined) => {
|
|
282
337
|
if (refs) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
if (
|
|
287
|
-
|
|
338
|
+
let node = refs;
|
|
339
|
+
do {
|
|
340
|
+
node = node.next;
|
|
341
|
+
if (node.data === lref) {
|
|
342
|
+
ListRemoveEntry(node);
|
|
343
|
+
if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
|
|
344
|
+
this.hierRefCount--;
|
|
345
|
+
}
|
|
346
|
+
this.refCount--;
|
|
347
|
+
return lref;
|
|
288
348
|
}
|
|
289
|
-
|
|
290
|
-
return lref;
|
|
291
|
-
}
|
|
349
|
+
} while (!node.isHead);
|
|
292
350
|
}
|
|
293
351
|
};
|
|
294
352
|
const refAtOffset = this.refsByOffset[lref.offset];
|
|
@@ -311,6 +369,8 @@ export class LocalReferenceCollection {
|
|
|
311
369
|
}
|
|
312
370
|
|
|
313
371
|
/**
|
|
372
|
+
* @internal - this method should only be called by mergeTree
|
|
373
|
+
*
|
|
314
374
|
* Called by 'append()' implementations to append local refs from the given 'other' segment to the
|
|
315
375
|
* end of 'this' segment.
|
|
316
376
|
*
|
|
@@ -334,6 +394,8 @@ export class LocalReferenceCollection {
|
|
|
334
394
|
}
|
|
335
395
|
|
|
336
396
|
/**
|
|
397
|
+
* @internal - this method should only be called by mergeTree
|
|
398
|
+
*
|
|
337
399
|
* Splits this `LocalReferenceCollection` into the intervals [0, offset) and [offset, originalLength).
|
|
338
400
|
* Local references in the former half of this split will remain associated with the segment used on construction.
|
|
339
401
|
* Local references in the latter half of this split will be transferred to `splitSeg`,
|
|
@@ -353,7 +415,7 @@ export class LocalReferenceCollection {
|
|
|
353
415
|
for (const lref of localRefs) {
|
|
354
416
|
lref.segment = splitSeg;
|
|
355
417
|
lref.offset -= offset;
|
|
356
|
-
if (lref
|
|
418
|
+
if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
|
|
357
419
|
this.hierRefCount--;
|
|
358
420
|
localRefs.hierRefCount++;
|
|
359
421
|
}
|
|
@@ -366,17 +428,17 @@ export class LocalReferenceCollection {
|
|
|
366
428
|
}
|
|
367
429
|
}
|
|
368
430
|
|
|
369
|
-
public addBeforeTombstones(...refs: Iterable<LocalReference>[]) {
|
|
370
|
-
const beforeRefs
|
|
431
|
+
public addBeforeTombstones(...refs: Iterable<LocalReference | ReferencePosition>[]) {
|
|
432
|
+
const beforeRefs = this.refsByOffset[0]?.before ?? ListMakeHead();
|
|
371
433
|
|
|
372
434
|
for (const iterable of refs) {
|
|
373
435
|
for (const lref of iterable) {
|
|
374
|
-
|
|
375
|
-
if (lref
|
|
436
|
+
assertLocalReferences(lref);
|
|
437
|
+
if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {
|
|
376
438
|
beforeRefs.push(lref);
|
|
377
439
|
lref.segment = this.segment;
|
|
378
440
|
lref.offset = 0;
|
|
379
|
-
if (lref
|
|
441
|
+
if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
|
|
380
442
|
this.hierRefCount++;
|
|
381
443
|
}
|
|
382
444
|
this.refCount++;
|
|
@@ -385,28 +447,27 @@ export class LocalReferenceCollection {
|
|
|
385
447
|
}
|
|
386
448
|
}
|
|
387
449
|
}
|
|
388
|
-
if (beforeRefs.
|
|
389
|
-
|
|
390
|
-
this.refsByOffset[0]
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
} else {
|
|
394
|
-
this.refsByOffset[0].before.unshift(...beforeRefs);
|
|
395
|
-
}
|
|
450
|
+
if (!beforeRefs.empty() && this.refsByOffset[0]?.before === undefined) {
|
|
451
|
+
const refsAtOffset = this.refsByOffset[0] =
|
|
452
|
+
this.refsByOffset[0]
|
|
453
|
+
?? { before: beforeRefs };
|
|
454
|
+
refsAtOffset.before = refsAtOffset.before ?? beforeRefs;
|
|
396
455
|
}
|
|
397
456
|
}
|
|
398
457
|
|
|
399
|
-
public addAfterTombstones(...refs: Iterable<LocalReference>[]) {
|
|
400
|
-
const
|
|
458
|
+
public addAfterTombstones(...refs: Iterable<LocalReference | ReferencePosition>[]) {
|
|
459
|
+
const lastOffset = this.refsByOffset.length - 1;
|
|
460
|
+
const afterRefs =
|
|
461
|
+
this.refsByOffset[lastOffset]?.after ?? ListMakeHead();
|
|
401
462
|
|
|
402
463
|
for (const iterable of refs) {
|
|
403
464
|
for (const lref of iterable) {
|
|
404
|
-
|
|
405
|
-
if (lref
|
|
465
|
+
assertLocalReferences(lref);
|
|
466
|
+
if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {
|
|
406
467
|
afterRefs.push(lref);
|
|
407
468
|
lref.segment = this.segment;
|
|
408
469
|
lref.offset = this.segment.cachedLength - 1;
|
|
409
|
-
if (lref
|
|
470
|
+
if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
|
|
410
471
|
this.hierRefCount++;
|
|
411
472
|
}
|
|
412
473
|
this.refCount++;
|
|
@@ -415,15 +476,11 @@ export class LocalReferenceCollection {
|
|
|
415
476
|
}
|
|
416
477
|
}
|
|
417
478
|
}
|
|
418
|
-
if (afterRefs.
|
|
419
|
-
const refsAtOffset = this.refsByOffset[
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
refsAtOffset.after = afterRefs;
|
|
424
|
-
} else {
|
|
425
|
-
refsAtOffset.after.push(...afterRefs);
|
|
426
|
-
}
|
|
479
|
+
if (!afterRefs.empty() && this.refsByOffset[lastOffset]?.after === undefined) {
|
|
480
|
+
const refsAtOffset = this.refsByOffset[lastOffset] =
|
|
481
|
+
this.refsByOffset[lastOffset]
|
|
482
|
+
?? { after: afterRefs };
|
|
483
|
+
refsAtOffset.after = refsAtOffset.after ?? afterRefs;
|
|
427
484
|
}
|
|
428
485
|
}
|
|
429
486
|
}
|
package/src/mergeTree.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
7
7
|
/* eslint-disable @typescript-eslint/consistent-type-assertions */
|
|
8
8
|
|
|
9
|
-
/* eslint-disable no-bitwise */
|
|
9
|
+
/* eslint-disable @typescript-eslint/prefer-optional-chain, no-bitwise */
|
|
10
10
|
|
|
11
11
|
import { assert } from "@fluidframework/common-utils";
|
|
12
12
|
import {
|
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
PropertySet,
|
|
52
52
|
} from "./properties";
|
|
53
53
|
import {
|
|
54
|
+
refTypeIncludesFlag,
|
|
54
55
|
RangeStackMap,
|
|
55
56
|
ReferencePosition,
|
|
56
57
|
refGetRangeLabels,
|
|
@@ -62,6 +63,7 @@ import {
|
|
|
62
63
|
} from "./referencePositions";
|
|
63
64
|
import { SegmentGroupCollection } from "./segmentGroupCollection";
|
|
64
65
|
import { PropertiesManager } from "./segmentPropertiesManager";
|
|
66
|
+
import { Client } from "./client";
|
|
65
67
|
|
|
66
68
|
export interface IMergeNodeCommon {
|
|
67
69
|
parent?: IMergeBlock;
|
|
@@ -294,14 +296,14 @@ function applyStackDelta(currentStackMap: RangeStackMap, deltaStackMap: RangeSta
|
|
|
294
296
|
}
|
|
295
297
|
|
|
296
298
|
function applyRangeReference(stack: Stack<ReferencePosition>, delta: ReferencePosition) {
|
|
297
|
-
if (delta
|
|
299
|
+
if (refTypeIncludesFlag(delta, ReferenceType.NestBegin)) {
|
|
298
300
|
stack.push(delta);
|
|
299
301
|
return true;
|
|
300
302
|
} else {
|
|
301
303
|
// Assume delta is end reference
|
|
302
304
|
const top = stack.top();
|
|
303
305
|
// TODO: match end with begin
|
|
304
|
-
if (top && (top
|
|
306
|
+
if (top && (refTypeIncludesFlag(top, ReferenceType.NestBegin))) {
|
|
305
307
|
stack.pop();
|
|
306
308
|
} else {
|
|
307
309
|
stack.push(delta);
|
|
@@ -332,7 +334,7 @@ function addNodeReferences(
|
|
|
332
334
|
if (markerId) {
|
|
333
335
|
mergeTree.mapIdToSegment(markerId, segment);
|
|
334
336
|
}
|
|
335
|
-
if (segment
|
|
337
|
+
if (refTypeIncludesFlag(segment, ReferenceType.Tile)) {
|
|
336
338
|
addTile(segment, rightmostTiles);
|
|
337
339
|
addTileIfNotPresent(segment, leftmostTiles);
|
|
338
340
|
}
|
|
@@ -349,7 +351,7 @@ function addNodeReferences(
|
|
|
349
351
|
if (baseSegment.localRefs && (baseSegment.localRefs.hierRefCount !== undefined) &&
|
|
350
352
|
(baseSegment.localRefs.hierRefCount > 0)) {
|
|
351
353
|
for (const lref of baseSegment.localRefs) {
|
|
352
|
-
if (lref
|
|
354
|
+
if (refTypeIncludesFlag(lref, ReferenceType.Tile)) {
|
|
353
355
|
addTile(lref, rightmostTiles);
|
|
354
356
|
addTileIfNotPresent(lref, leftmostTiles);
|
|
355
357
|
}
|
|
@@ -725,16 +727,16 @@ export class Marker extends BaseSegment implements ReferencePosition {
|
|
|
725
727
|
|
|
726
728
|
toString() {
|
|
727
729
|
let bbuf = "";
|
|
728
|
-
if (this
|
|
730
|
+
if (refTypeIncludesFlag(this, ReferenceType.Tile)) {
|
|
729
731
|
bbuf += "Tile";
|
|
730
732
|
}
|
|
731
|
-
if (this
|
|
733
|
+
if (refTypeIncludesFlag(this, ReferenceType.NestBegin)) {
|
|
732
734
|
if (bbuf.length > 0) {
|
|
733
735
|
bbuf += "; ";
|
|
734
736
|
}
|
|
735
737
|
bbuf += "RangeBegin";
|
|
736
738
|
}
|
|
737
|
-
if (this
|
|
739
|
+
if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {
|
|
738
740
|
if (bbuf.length > 0) {
|
|
739
741
|
bbuf += "; ";
|
|
740
742
|
}
|
|
@@ -759,7 +761,7 @@ export class Marker extends BaseSegment implements ReferencePosition {
|
|
|
759
761
|
const rangeLabels = refGetRangeLabels(this);
|
|
760
762
|
if (rangeLabels) {
|
|
761
763
|
let rangeKind = "begin";
|
|
762
|
-
if (this
|
|
764
|
+
if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {
|
|
763
765
|
rangeKind = "end";
|
|
764
766
|
}
|
|
765
767
|
if (tileLabels) {
|
|
@@ -2442,6 +2444,31 @@ export class MergeTree {
|
|
|
2442
2444
|
}
|
|
2443
2445
|
}
|
|
2444
2446
|
|
|
2447
|
+
public removeLocalReferencePosition(lref: ReferencePosition): ReferencePosition | undefined {
|
|
2448
|
+
const segment = lref.getSegment();
|
|
2449
|
+
if (segment) {
|
|
2450
|
+
const removedRefs = segment?.localRefs?.removeLocalRef(lref);
|
|
2451
|
+
if (removedRefs !== undefined) {
|
|
2452
|
+
this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,
|
|
2453
|
+
LocalClientId);
|
|
2454
|
+
}
|
|
2455
|
+
return removedRefs;
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2458
|
+
public createLocalReferencePosition(
|
|
2459
|
+
segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined,
|
|
2460
|
+
client: Client,
|
|
2461
|
+
): ReferencePosition {
|
|
2462
|
+
const localRefs = segment.localRefs ?? new LocalReferenceCollection(segment);
|
|
2463
|
+
segment.localRefs = localRefs;
|
|
2464
|
+
|
|
2465
|
+
const segRef = localRefs.createLocalRef(offset, refType, properties, client);
|
|
2466
|
+
|
|
2467
|
+
this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,
|
|
2468
|
+
LocalClientId);
|
|
2469
|
+
return segRef;
|
|
2470
|
+
}
|
|
2471
|
+
|
|
2445
2472
|
/**
|
|
2446
2473
|
* @deprecated - use removeLocalReferencePosition
|
|
2447
2474
|
*/
|
|
@@ -11,14 +11,18 @@ import { PropertySet, MapLike } from "./properties";
|
|
|
11
11
|
export const reservedTileLabelsKey = "referenceTileLabels";
|
|
12
12
|
export const reservedRangeLabelsKey = "referenceRangeLabels";
|
|
13
13
|
|
|
14
|
-
export
|
|
14
|
+
export function refTypeIncludesFlag(refPos: ReferencePosition, flags: ReferenceType): boolean {
|
|
15
15
|
// eslint-disable-next-line no-bitwise
|
|
16
|
-
(refPos.refType &
|
|
16
|
+
return (refPos.refType & flags) !== 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>
|
|
20
|
+
refTypeIncludesFlag(refPos, ReferenceType.Tile)
|
|
17
21
|
&& refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;
|
|
18
22
|
|
|
19
23
|
export const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>
|
|
20
24
|
// eslint-disable-next-line no-bitwise
|
|
21
|
-
(refPos
|
|
25
|
+
(refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))
|
|
22
26
|
&& refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;
|
|
23
27
|
|
|
24
28
|
export function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {
|
package/src/snapshotlegacy.ts
CHANGED
|
@@ -157,7 +157,7 @@ export class SnapshotLegacy {
|
|
|
157
157
|
if ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&
|
|
158
158
|
((segment.removedSeq === undefined) || (segment.removedSeq === UnassignedSequenceNumber) ||
|
|
159
159
|
(segment.removedSeq > this.seq!))) {
|
|
160
|
-
if (prev
|
|
160
|
+
if (prev?.canAppend(segment)
|
|
161
161
|
&& matchProperties(prev.properties, segment.properties)
|
|
162
162
|
) {
|
|
163
163
|
prev = prev.clone();
|
package/src/sortedSegmentSet.ts
CHANGED
|
@@ -53,7 +53,7 @@ export class SortedSegmentSet<T extends ISegment | { readonly segment: ISegment;
|
|
|
53
53
|
|
|
54
54
|
private getOrdinal(item: T): string {
|
|
55
55
|
const maybeObject = item as { readonly segment: ISegment; };
|
|
56
|
-
if (maybeObject
|
|
56
|
+
if (maybeObject?.segment) {
|
|
57
57
|
return maybeObject.segment.ordinal;
|
|
58
58
|
}
|
|
59
59
|
|
package/src/textSegment.ts
CHANGED
|
@@ -204,10 +204,10 @@ export class MergeTreeTextHelper {
|
|
|
204
204
|
const tags = [] as string[];
|
|
205
205
|
const initTags = [] as string[];
|
|
206
206
|
|
|
207
|
-
if (segment.properties
|
|
207
|
+
if (segment.properties?.["font-weight"]) {
|
|
208
208
|
tags.push("b");
|
|
209
209
|
}
|
|
210
|
-
if (segment.properties
|
|
210
|
+
if (segment.properties?.["text-decoration"]) {
|
|
211
211
|
tags.push("u");
|
|
212
212
|
}
|
|
213
213
|
const remTags = [] as string[];
|