diff --git a/src/types/YText.js b/src/types/YText.js index 328795e0..8e505f5a 100644 --- a/src/types/YText.js +++ b/src/types/YText.js @@ -465,7 +465,7 @@ const deleteText = (transaction, currPos, length) => { currPos.forward() } if (start) { - cleanupFormattingGap(transaction, start, currPos.right, startAttrs, map.copy(currPos.currentAttributes)) + cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes) } const parent = /** @type {AbstractType} */ (/** @type {Item} */ (currPos.left || currPos.right).parent) if (parent._searchMarker) { diff --git a/tests/y-text.tests.js b/tests/y-text.tests.js index 2a555237..7a8c448a 100644 --- a/tests/y-text.tests.js +++ b/tests/y-text.tests.js @@ -138,6 +138,28 @@ export const testNotMergeEmptyLinesFormat = tc => { ]) } +/** + * @param {t.TestCase} tc + */ +export const testPreserveAttributesThroughDelete = tc => { + const ydoc = new Y.Doc() + const testText = ydoc.getText('test') + testText.applyDelta([ + { insert: 'Text' }, + { insert: '\n', attributes: { title: true } }, + { insert: '\n' } + ]) + testText.applyDelta([ + { retain: 4 }, + { delete: 1 }, + { retain: 1, attributes: { title: true } } + ]) + t.compare(testText.toDelta(), [ + { insert: 'Text' }, + { insert: '\n', attributes: { title: true } } + ]) +} + /** * @param {t.TestCase} tc */