From d1ee62c80a86792c0f18cce82ec18d682ee8d32d Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 8 Jun 2024 23:37:52 +0200 Subject: [PATCH] =?UTF-8?q?feat(json-crdt-extensions):=20=F0=9F=8E=B8=20ch?= =?UTF-8?q?op=20off=20block=20sentinel=20text=20from=20inline=20node=20mat?= =?UTF-8?q?erializati?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/json-crdt-extensions/peritext/block/Inline.ts | 6 ++++++ .../peritext/block/__tests__/Block.iteration.spec.ts | 4 ++-- .../peritext/block/__tests__/Blocks.spec.ts | 12 ++++++++++++ .../__tests__/{Inline.str.spec.ts => Inline.spec.ts} | 5 +++-- 4 files changed, 23 insertions(+), 4 deletions(-) rename src/json-crdt-extensions/peritext/block/__tests__/{Inline.str.spec.ts => Inline.spec.ts} (98%) diff --git a/src/json-crdt-extensions/peritext/block/Inline.ts b/src/json-crdt-extensions/peritext/block/Inline.ts index 4974fe874d..880adc2f4a 100644 --- a/src/json-crdt-extensions/peritext/block/Inline.ts +++ b/src/json-crdt-extensions/peritext/block/Inline.ts @@ -5,6 +5,7 @@ import {SliceBehavior, SliceTypes} from '../slice/constants'; import {Range} from '../rga/Range'; import {ChunkSlice} from '../util/ChunkSlice'; import {updateNum} from '../../../json-hash'; +import {MarkerOverlayPoint} from '../overlay/MarkerOverlayPoint'; import type {AbstractRga} from '../../../json-crdt/nodes/rga'; import type {Printable} from 'tree-dump/lib/types'; import type {PathStep} from '../../../json-pointer'; @@ -141,6 +142,11 @@ export class Inline extends Range implements Printable { return attr; } + public text(): string { + const str = super.text(); + return this.start instanceof MarkerOverlayPoint ? str.slice(1) : str; + } + // ---------------------------------------------------------------- Printable public toString(tab: string = ''): string { diff --git a/src/json-crdt-extensions/peritext/block/__tests__/Block.iteration.spec.ts b/src/json-crdt-extensions/peritext/block/__tests__/Block.iteration.spec.ts index 69398332e7..e742adf581 100644 --- a/src/json-crdt-extensions/peritext/block/__tests__/Block.iteration.spec.ts +++ b/src/json-crdt-extensions/peritext/block/__tests__/Block.iteration.spec.ts @@ -115,7 +115,7 @@ describe('tuples', () => { const text1 = tuples1.map(([p1, p2]) => Inline.create(peritext, p1, p2).text()).join(''); const text2 = tuples2.map(([p1, p2]) => Inline.create(peritext, p1, p2).text()).join(''); expect(text1).toBe('hello '); - expect(text2).toBe('\nworld'); + expect(text2).toBe('world'); }); }); @@ -137,6 +137,6 @@ describe('texts', () => { const text1 = [...block1.texts()].map((inline) => inline.text()).join(''); const text2 = [...block2.texts()].map((inline) => inline.text()).join(''); expect(text1).toBe('hello '); - expect(text2).toBe('\nworld'); + expect(text2).toBe('world'); }); }); diff --git a/src/json-crdt-extensions/peritext/block/__tests__/Blocks.spec.ts b/src/json-crdt-extensions/peritext/block/__tests__/Blocks.spec.ts index 00ca06edcd..9ad44f4b7e 100644 --- a/src/json-crdt-extensions/peritext/block/__tests__/Blocks.spec.ts +++ b/src/json-crdt-extensions/peritext/block/__tests__/Blocks.spec.ts @@ -31,3 +31,15 @@ test('can construct a two-paragraph document', () => { expect(paragraph1.marker).toBe(undefined); expect(paragraph2.marker instanceof MarkerOverlayPoint).toBe(true); }); + +test('first inline element does not contain marker text', () => { + const {peritext} = setupHelloWorldKit(); + peritext.editor.cursor.setAt(6); + peritext.editor.saved.insMarker('p'); + peritext.editor.delCursors(); + peritext.refresh(); + expect(peritext.strApi().view()).toBe('hello \nworld'); + const [block1, block2] = peritext.blocks.root.children; + expect([...block1.texts()][0].text()).toBe('hello '); + expect([...block2.texts()][0].text()).toBe('world'); +}); diff --git a/src/json-crdt-extensions/peritext/block/__tests__/Inline.str.spec.ts b/src/json-crdt-extensions/peritext/block/__tests__/Inline.spec.ts similarity index 98% rename from src/json-crdt-extensions/peritext/block/__tests__/Inline.str.spec.ts rename to src/json-crdt-extensions/peritext/block/__tests__/Inline.spec.ts index 11d95b5a89..ff5dc1134b 100644 --- a/src/json-crdt-extensions/peritext/block/__tests__/Inline.str.spec.ts +++ b/src/json-crdt-extensions/peritext/block/__tests__/Inline.spec.ts @@ -210,14 +210,15 @@ const runStrTests = (setup: () => Kit) => { test('correctly reports *Contained* positions', () => { const {peritext} = setup(); peritext.editor.cursor.setAt(2, 6); - peritext.editor.saved.insStack(['a', 1, 'b', 2]); + const [slice] = peritext.editor.saved.insStack(['a', 1, 'b', 2]); + peritext.editor.cursor.set(slice.start); peritext.refresh(); const str = peritext.strApi().view(); const [inline1, inline2, inline3] = peritext.blocks.root.children[0]!.texts(); expect(inline1.text()).toBe(str.slice(0, 2)); expect(inline2.text()).toBe(str.slice(2, 8)); expect(inline2.attr()).toEqual({ - [SliceTypes.Cursor]: [[[CursorAnchor.Start]], InlineAttrPos.Contained], + [SliceTypes.Cursor]: [[[CursorAnchor.Start]], InlineAttrPos.Collapsed], 'a,1,b,2': [[void 0], InlineAttrPos.Contained], }); expect(inline3.text()).toBe(str.slice(8));