Skip to content

Commit d1ee62c

Browse files
committed
feat(json-crdt-extensions): 🎸 chop off block sentinel text from inline node materializati
1 parent a914764 commit d1ee62c

File tree

4 files changed

+23
-4
lines changed

4 files changed

+23
-4
lines changed

‎src/json-crdt-extensions/peritext/block/Inline.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {SliceBehavior, SliceTypes} from '../slice/constants';
55
import {Range} from '../rga/Range';
66
import {ChunkSlice} from '../util/ChunkSlice';
77
import {updateNum} from '../../../json-hash';
8+
import {MarkerOverlayPoint} from '../overlay/MarkerOverlayPoint';
89
import type {AbstractRga} from '../../../json-crdt/nodes/rga';
910
import type {Printable} from 'tree-dump/lib/types';
1011
import type {PathStep} from '../../../json-pointer';
@@ -141,6 +142,11 @@ export class Inline extends Range implements Printable {
141142
return attr;
142143
}
143144

145+
public text(): string {
146+
const str = super.text();
147+
return this.start instanceof MarkerOverlayPoint ? str.slice(1) : str;
148+
}
149+
144150
// ---------------------------------------------------------------- Printable
145151

146152
public toString(tab: string = ''): string {

‎src/json-crdt-extensions/peritext/block/__tests__/Block.iteration.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ describe('tuples', () => {
115115
const text1 = tuples1.map(([p1, p2]) => Inline.create(peritext, p1, p2).text()).join('');
116116
const text2 = tuples2.map(([p1, p2]) => Inline.create(peritext, p1, p2).text()).join('');
117117
expect(text1).toBe('hello ');
118-
expect(text2).toBe('\nworld');
118+
expect(text2).toBe('world');
119119
});
120120
});
121121

@@ -137,6 +137,6 @@ describe('texts', () => {
137137
const text1 = [...block1.texts()].map((inline) => inline.text()).join('');
138138
const text2 = [...block2.texts()].map((inline) => inline.text()).join('');
139139
expect(text1).toBe('hello ');
140-
expect(text2).toBe('\nworld');
140+
expect(text2).toBe('world');
141141
});
142142
});

‎src/json-crdt-extensions/peritext/block/__tests__/Blocks.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,15 @@ test('can construct a two-paragraph document', () => {
3131
expect(paragraph1.marker).toBe(undefined);
3232
expect(paragraph2.marker instanceof MarkerOverlayPoint).toBe(true);
3333
});
34+
35+
test('first inline element does not contain marker text', () => {
36+
const {peritext} = setupHelloWorldKit();
37+
peritext.editor.cursor.setAt(6);
38+
peritext.editor.saved.insMarker('p');
39+
peritext.editor.delCursors();
40+
peritext.refresh();
41+
expect(peritext.strApi().view()).toBe('hello \nworld');
42+
const [block1, block2] = peritext.blocks.root.children;
43+
expect([...block1.texts()][0].text()).toBe('hello ');
44+
expect([...block2.texts()][0].text()).toBe('world');
45+
});

‎src/json-crdt-extensions/peritext/block/__tests__/Inline.str.spec.ts renamed to ‎src/json-crdt-extensions/peritext/block/__tests__/Inline.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,15 @@ const runStrTests = (setup: () => Kit) => {
210210
test('correctly reports *Contained* positions', () => {
211211
const {peritext} = setup();
212212
peritext.editor.cursor.setAt(2, 6);
213-
peritext.editor.saved.insStack(['a', 1, 'b', 2]);
213+
const [slice] = peritext.editor.saved.insStack(['a', 1, 'b', 2]);
214+
peritext.editor.cursor.set(slice.start);
214215
peritext.refresh();
215216
const str = peritext.strApi().view();
216217
const [inline1, inline2, inline3] = peritext.blocks.root.children[0]!.texts();
217218
expect(inline1.text()).toBe(str.slice(0, 2));
218219
expect(inline2.text()).toBe(str.slice(2, 8));
219220
expect(inline2.attr()).toEqual({
220-
[SliceTypes.Cursor]: [[[CursorAnchor.Start]], InlineAttrPos.Contained],
221+
[SliceTypes.Cursor]: [[[CursorAnchor.Start]], InlineAttrPos.Collapsed],
221222
'a,1,b,2': [[void 0], InlineAttrPos.Contained],
222223
});
223224
expect(inline3.text()).toBe(str.slice(8));

0 commit comments

Comments
 (0)