/* * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ import { StateEffect, StateField, TransactionSpec } from '@codemirror/state'; import { EditorView, Decoration, DecorationSet } from '@codemirror/view'; export type TransactionSpecFactory = ( decorations: DecorationSet, ) => TransactionSpec; export default function defineDecorationSetExtension(): [ TransactionSpecFactory, StateField, ] { const setEffect = StateEffect.define(); const stateField = StateField.define({ create() { return Decoration.none; }, update(currentDecorations, transaction) { let newDecorations: DecorationSet | null = null; transaction.effects.forEach((effect) => { if (effect.is(setEffect)) { newDecorations = effect.value; } }); if (newDecorations === null) { if (transaction.docChanged) { return currentDecorations.map(transaction.changes); } return currentDecorations; } return newDecorations; }, provide: (field) => EditorView.decorations.from(field), }); function transactionSpecFactory(decorations: DecorationSet) { return { effects: [setEffect.of(decorations)], }; } return [transactionSpecFactory, stateField]; }