UNPKG

@portabletext/editor

Version:

Portable Text Editor made in React

280 lines (259 loc) 6.96 kB
import {describe, expect, test} from 'vitest' import {compileSchemaDefinition} from '../editor/editor-schema' import {defineSchema} from '../editor/editor-schema-definition' import {createTestKeyGenerator} from './test-key-generator' import {toSlateRange} from './to-slate-range' describe(toSlateRange.name, () => { const schema = compileSchemaDefinition( defineSchema({ blockObjects: [{name: 'image'}], inlineObjects: [ {name: 'stock-ticker', fields: [{name: 'symbol', type: 'string'}]}, ], }), ) test('Scenario: Ambiguous offset inside text block', () => { const keyGenerator = createTestKeyGenerator() const blockKey = keyGenerator() const range = toSlateRange({ context: { schema, value: [ { _key: blockKey, _type: 'block', children: [ { _key: keyGenerator(), _type: 'span', text: 'foo', }, { _key: keyGenerator(), _type: 'stock-ticker', }, { _key: keyGenerator(), _type: 'span', text: 'bar', }, ], }, ], selection: { anchor: { path: [{_key: blockKey}], // Could point to either before or after the inline object offset: 3, }, focus: { path: [{_key: blockKey}], // Could point to either before or after the inline object offset: 3, }, }, }, blockIndexMap: new Map([[blockKey, 0]]), }) expect(range).toEqual({ anchor: {path: [0, 2], offset: 0}, focus: {path: [0, 2], offset: 0}, }) }) test('Scenario: Offset right before inline object', () => { const keyGenerator = createTestKeyGenerator() const blockKey = keyGenerator() const range = toSlateRange({ context: { schema, value: [ { _key: blockKey, _type: 'block', children: [ { _key: keyGenerator(), _type: 'span', text: "'", }, { _key: keyGenerator(), _type: 'stock-ticker', }, { _key: keyGenerator(), _type: 'span', text: "foo'", }, ], }, ], selection: { anchor: { path: [{_key: blockKey}], offset: 0, }, focus: { path: [{_key: blockKey}], offset: 1, }, }, }, blockIndexMap: new Map([[blockKey, 0]]), }) expect(range).toEqual({ anchor: {path: [0, 0], offset: 0}, focus: {path: [0, 0], offset: 1}, }) }) test("Scenario: Block object offset that doesn't exist", () => { const keyGenerator = createTestKeyGenerator() const blockObjectKey = keyGenerator() const range = toSlateRange({ context: { schema, value: [ { _key: blockObjectKey, _type: 'image', }, ], selection: { anchor: { path: [{_key: blockObjectKey}], offset: 3, }, focus: { path: [{_key: blockObjectKey}], offset: 3, }, }, }, blockIndexMap: new Map([[blockObjectKey, 0]]), }) expect(range).toEqual({ anchor: {path: [0, 0], offset: 0}, focus: {path: [0, 0], offset: 0}, }) }) test("Scenario: Child that doesn't exist", () => { const keyGenerator = createTestKeyGenerator() const blockKey = keyGenerator() const removedChildKey = keyGenerator() const range = toSlateRange({ context: { schema, value: [ { _key: blockKey, _type: 'block', children: [ { _key: keyGenerator(), _type: 'span', text: 'foobar', }, ], }, ], selection: { anchor: { path: [{_key: blockKey}, 'children', {_key: removedChildKey}], offset: 3, }, focus: { path: [{_key: blockKey}, 'children', {_key: removedChildKey}], offset: 3, }, }, }, blockIndexMap: new Map([[blockKey, 0]]), }) expect(range).toEqual({ anchor: {path: [0, 0], offset: 0}, focus: {path: [0, 0], offset: 0}, }) }) test("Scenario: Span offset that doesn't exist", () => { const keyGenerator = createTestKeyGenerator() const blockKey = keyGenerator() const spanKey = keyGenerator() const range = toSlateRange({ context: { schema, value: [ { _key: blockKey, _type: 'block', children: [ { _key: spanKey, _type: 'span', text: 'foo', }, ], }, ], selection: { anchor: { path: [{_key: blockKey}, 'children', {_key: spanKey}], offset: 4, }, focus: { path: [{_key: blockKey}, 'children', {_key: spanKey}], offset: 4, }, }, }, blockIndexMap: new Map([[blockKey, 0]]), }) expect(range).toEqual({ anchor: {path: [0, 0], offset: 3}, focus: {path: [0, 0], offset: 3}, }) }) test("Scenario: Inline object offset that doesn't exist", () => { const keyGenerator = createTestKeyGenerator() const blockKey = keyGenerator() const inlineObjectKey = keyGenerator() const range = toSlateRange({ context: { schema, value: [ { _key: blockKey, _type: 'block', children: [ {_key: keyGenerator(), _type: 'span', text: 'foo'}, { _key: inlineObjectKey, _type: 'stock-ticker', symbol: 'AAPL', }, { _key: keyGenerator(), _type: 'span', text: 'bar', }, ], }, ], selection: { anchor: { path: [{_key: blockKey}, 'children', {_key: inlineObjectKey}], offset: 3, }, focus: { path: [{_key: blockKey}, 'children', {_key: inlineObjectKey}], offset: 3, }, }, }, blockIndexMap: new Map([[blockKey, 0]]), }) expect(range).toEqual({ anchor: {path: [0, 1, 0], offset: 0}, focus: {path: [0, 1, 0], offset: 0}, }) }) })