Преглед на файлове

Add: Introduce SplitDelta x RemoveDelta special case transformations.

Szymon Cofalik преди 9 години
родител
ревизия
d2a82178e4

+ 37 - 0
packages/ckeditor5-engine/src/model/delta/basic-transformations.js

@@ -27,6 +27,7 @@ import WeakInsertDelta from './weakinsertdelta.js';
 import WrapDelta from './wrapdelta.js';
 import UnwrapDelta from './unwrapdelta.js';
 import RenameDelta from './renamedelta.js';
+import RemoveDelta from './removedelta.js';
 
 import compareArrays from '../../../utils/comparearrays.js';
 
@@ -390,6 +391,42 @@ addTransformationCase( SplitDelta, RenameDelta, ( a, b ) => {
 	return [ a ];
 } );
 
+// Add special case for RemoveDelta x SplitDelta transformation.
+addTransformationCase( RemoveDelta, SplitDelta, ( a, b, isStrong ) => {
+	const deltas = defaultTransform( a, b, isStrong );
+	const insertPosition = b._cloneOperation.position;
+
+	// In case if `defaultTransform` returned more than one delta.
+	for ( let delta of deltas ) {
+		for ( let operation of delta.operations ) {
+			const rangeEnd = operation.sourcePosition.getShiftedBy( operation.howMany );
+
+			if ( rangeEnd.isEqual( insertPosition ) ) {
+				operation.howMany += 1;
+			}
+		}
+	}
+
+	return deltas;
+} );
+
+// Add special case for SplitDelta x RemoveDelta transformation.
+addTransformationCase( SplitDelta, RemoveDelta, ( a, b, isStrong ) => {
+	b = b.clone();
+
+	const insertPosition = a._cloneOperation.position;
+
+	for ( let operation of b.operations ) {
+		const rangeEnd = operation.sourcePosition.getShiftedBy( operation.howMany );
+
+		if ( rangeEnd.isEqual( insertPosition ) ) {
+			operation.howMany += 1;
+		}
+	}
+
+	return defaultTransform( a, b, isStrong );
+} );
+
 // Helper function for `AttributeDelta` class transformations.
 // Creates an attribute delta that sets attribute from given `attributeDelta` on nodes from given `weakInsertDelta`.
 function _getComplementaryAttrDelta( weakInsertDelta, attributeDelta ) {

+ 3 - 1
packages/ckeditor5-engine/src/model/delta/transform.js

@@ -191,8 +191,10 @@ export function getTransformationCase( a, b ) {
 		const cases = specialCases.keys();
 
 		for ( let caseClass of cases ) {
-			if ( a instanceof caseClass ) {
+			if ( a instanceof caseClass && specialCases.get( caseClass ).get( b.constructor ) ) {
 				casesA = specialCases.get( caseClass );
+
+				break;
 			}
 		}
 	}

+ 1 - 1
packages/ckeditor5-engine/tests/model/delta/transform/removedelta.js

@@ -13,7 +13,7 @@ import transform from 'ckeditor5/engine/model/delta/transform.js';
 import Position from 'ckeditor5/engine/model/position.js';
 import Range from 'ckeditor5/engine/model/range.js';
 
-import RemoveDelta from 'ckeditor5/engine/model/delta/movedelta.js';
+import RemoveDelta from 'ckeditor5/engine/model/delta/removedelta.js';
 import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
 import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';