diff --git a/src/json-crdt-extensions/peritext/editor/Editor.ts b/src/json-crdt-extensions/peritext/editor/Editor.ts index 648f17f47f..58aebecb9a 100644 --- a/src/json-crdt-extensions/peritext/editor/Editor.ts +++ b/src/json-crdt-extensions/peritext/editor/Editor.ts @@ -1,7 +1,7 @@ import {printTree} from 'tree-dump/lib/printTree'; import {Cursor} from './Cursor'; import {stringify} from '../../../json-text/stringify'; -import {CursorAnchor, SliceBehavior} from '../slice/constants'; +import {CursorAnchor, SliceBehavior, SliceHeaderShift} from '../slice/constants'; import {EditorSlices} from './EditorSlices'; import {next, prev} from 'sonic-forest/lib/util'; import {isLetter, isPunctuation, isWhitespace} from './util'; @@ -673,11 +673,11 @@ export class Editor implements Printable { r.start.refBefore(); r.end.refAfter(); const text = r.text(); - const viewSlices: ViewRange[1] = []; - const view: ViewRange = [text, viewSlices]; + const offset = r.start.viewPos(); + const viewSlices: ViewSlice[] = []; + const view: ViewRange = [text, offset, viewSlices]; const overlay = this.txt.overlay; const slices = overlay.findOverlapping(r); - const offset = r.start.viewPos(); for (const slice of slices) { const behavior = slice.behavior; switch (behavior) { @@ -685,13 +685,16 @@ export class Editor implements Printable { case SliceBehavior.Many: case SliceBehavior.Erase: case SliceBehavior.Marker: { + const {behavior, type, start, end} = slice; + const header: number = + (behavior << SliceHeaderShift.Behavior) + + (start.anchor << SliceHeaderShift.X1Anchor) + + (end.anchor << SliceHeaderShift.X2Anchor); const viewSlice: ViewSlice = [ - slice.start.viewPos() - offset, - slice.start.anchor, - slice.end.viewPos() - offset, - slice.end.anchor, - slice.behavior, - slice.type, + header, + start.viewPos(), + end.viewPos(), + type, ]; const data = slice.data(); if (data !== void 0) viewSlice.push(data); diff --git a/src/json-crdt-extensions/peritext/editor/__tests__/Editor-export.spec.ts b/src/json-crdt-extensions/peritext/editor/__tests__/Editor-export.spec.ts index 83c21b4dc9..68e786ba8a 100644 --- a/src/json-crdt-extensions/peritext/editor/__tests__/Editor-export.spec.ts +++ b/src/json-crdt-extensions/peritext/editor/__tests__/Editor-export.spec.ts @@ -1,6 +1,4 @@ import {type Kit, runAlphabetKitTestSuite} from '../../__tests__/setup'; -import {Anchor} from '../../rga/constants'; -import {SliceBehavior} from '../../slice/constants'; const testSuite = (setup: () => Kit) => { describe('.export()', () => { @@ -8,7 +6,7 @@ const testSuite = (setup: () => Kit) => { const {editor} = setup(); editor.selectAll(); const json = editor.export(editor.cursor); - expect(json).toEqual(['abcdefghijklmnopqrstuvwxyz', []]); + expect(json).toEqual(['abcdefghijklmnopqrstuvwxyz', 0, []]); }); test('can export range, which contains bold text', () => { @@ -18,13 +16,11 @@ const testSuite = (setup: () => Kit) => { const range = peritext.rangeAt(2, 5); peritext.refresh(); const json = editor.export(range); - expect(json).toEqual(['cdefg', [ + expect(json).toEqual(['cdefg', 2, [ [ - 1, - Anchor.Before, - 4, - Anchor.After, - SliceBehavior.One, + expect.any(Number), + 3, + 6, 'bold', ], ]]); diff --git a/src/json-crdt-extensions/peritext/editor/types.ts b/src/json-crdt-extensions/peritext/editor/types.ts index dd154bc080..497d8510a3 100644 --- a/src/json-crdt-extensions/peritext/editor/types.ts +++ b/src/json-crdt-extensions/peritext/editor/types.ts @@ -1,8 +1,6 @@ import type {UndefIterator} from '../../../util/iterator'; -import type {Anchor} from '../rga/constants'; import type {Point} from '../rga/Point'; import type {SliceType} from '../slice'; -import type {SliceBehavior} from '../slice/constants'; import type {ChunkSlice} from '../util/ChunkSlice'; export type CharIterator = UndefIterator>; @@ -13,15 +11,14 @@ export type TextRangeUnit = 'point' | 'char' | 'word' | 'line' | 'block' | 'all' export type ViewRange = [ text: string, + textPosition: number, slices: ViewSlice[], ]; export type ViewSlice = [ + header: number, x1: number, - a1: Anchor, x2: number, - a2: Anchor, - behavior: SliceBehavior, type: SliceType, data?: unknown, ];