Browse Source

WiP: Introduce Position, Range & Selection APIs on model & model/writer.

Maciej Gołaszewski 7 years ago
parent
commit
6f28d06dec

+ 4 - 5
packages/ckeditor5-engine/src/conversion/upcast-converters.js

@@ -6,7 +6,6 @@
 import Matcher from '../view/matcher';
 
 import ModelRange from '../model/range';
-import ModelPosition from '../model/position';
 
 import { cloneDeep } from 'lodash-es';
 
@@ -358,7 +357,7 @@ function _prepareToElementConverter( config ) {
 		conversionApi.writer.insert( modelElement, splitResult.position );
 
 		// Convert children and insert to element.
-		const childrenResult = conversionApi.convertChildren( data.viewItem, ModelPosition.createAt( modelElement, 0 ) );
+		const childrenResult = conversionApi.convertChildren( data.viewItem, conversionApi.writer.createPositionAt( modelElement, 0 ) );
 
 		// Consume appropriate value from consumable values list.
 		conversionApi.consumable.consume( data.viewItem, match.match );
@@ -366,12 +365,12 @@ function _prepareToElementConverter( config ) {
 		// Set conversion result range.
 		data.modelRange = new ModelRange(
 			// Range should start before inserted element
-			ModelPosition.createBefore( modelElement ),
+			conversionApi.writer.createPositionBefore( modelElement ),
 			// Should end after but we need to take into consideration that children could split our
 			// element, so we need to move range after parent of the last converted child.
 			// before: <allowed>[]</allowed>
 			// after: <allowed>[<converted><child></child></converted><child></child><converted>]</converted></allowed>
-			ModelPosition.createAfter( childrenResult.modelCursor.parent )
+			conversionApi.writer.createPositionAfter( childrenResult.modelCursor.parent )
 		);
 
 		// Now we need to check where the modelCursor should be.
@@ -380,7 +379,7 @@ function _prepareToElementConverter( config ) {
 		// before: <allowed><notAllowed>[]</notAllowed></allowed>
 		// after:  <allowed><notAllowed></notAllowed><converted></converted><notAllowed>[]</notAllowed></allowed>
 		if ( splitResult.cursorParent ) {
-			data.modelCursor = ModelPosition.createAt( splitResult.cursorParent, 0 );
+			data.modelCursor = conversionApi.writer.createPositionAt( splitResult.cursorParent, 0 );
 
 			// Otherwise just continue after inserted element.
 		} else {

+ 54 - 0
packages/ckeditor5-engine/src/model/model.js

@@ -16,6 +16,8 @@ import ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';
 import mix from '@ckeditor/ckeditor5-utils/src/mix';
 import ModelElement from './element';
 import ModelRange from './range';
+import ModelPosition from './position';
+import ModelSelection from './selection';
 
 import insertContent from './utils/insertcontent';
 import deleteContent from './utils/deletecontent';
@@ -468,6 +470,58 @@ export default class Model {
 		return false;
 	}
 
+	createPositionAt( itemOrPosition, offset ) {
+		if ( itemOrPosition instanceof ModelPosition ) {
+			return ModelPosition.createFromPosition( itemOrPosition );
+		} else {
+			const node = itemOrPosition;
+
+			if ( offset == 'end' ) {
+				offset = node.maxOffset;
+			} else if ( offset == 'before' ) {
+				return ModelPosition.createBefore( node );
+			} else if ( offset == 'after' ) {
+				return ModelPosition.createAfter( node );
+			} else if ( !offset ) {
+				offset = 0;
+			}
+
+			return ModelPosition.createFromParentAndOffset( node, offset );
+		}
+	}
+
+	createPositionAfter( item ) {
+		return this.createPositionAt( item, 'after' );
+	}
+
+	createPositionBefore( item ) {
+		return this.createPositionAt( item, 'before' );
+	}
+
+	createPositionFromPath( root, path ) {
+		return new ModelPosition( root, path );
+	}
+
+	createRange( start, end ) {
+		return new ModelRange( start, end );
+	}
+
+	createRangeIn( element ) {
+		return ModelRange.createIn( element );
+	}
+
+	createRangeOn( element ) {
+		return ModelRange.createOn( element );
+	}
+
+	createSelection( selectable ) {
+		return new ModelSelection( selectable );
+	}
+
+	createBatch() {
+		return new Batch();
+	}
+
 	/**
 	 * Removes all events listeners set by model instance and destroys {@link module:engine/model/document~Document}.
 	 */

+ 10 - 0
packages/ckeditor5-engine/src/model/schema.js

@@ -668,6 +668,16 @@ export default class Schema {
 	}
 
 	/**
+	 * Creates an instance of the schema context.
+	 *
+	 * @param {module:engine/model/schema~SchemaContextDefinition} context
+	 * @returns {module:engine/model/schema~SchemaContext}
+	 */
+	createContext( context ) {
+		return new SchemaContext( context );
+	}
+
+	/**
 	 * @private
 	 */
 	_clearCache() {

+ 32 - 0
packages/ckeditor5-engine/src/model/writer.js

@@ -544,6 +544,38 @@ export default class Writer {
 		}
 	}
 
+	createPositionAt( itemOrPosition, offset ) {
+		return this.model.createPositionAt( itemOrPosition, offset );
+	}
+
+	createPositionAfter( item ) {
+		return this.model.createPositionAfter( item );
+	}
+
+	createPositionBefore( item ) {
+		return this.model.createPositionBefore( item );
+	}
+
+	createPositionFromPath( root, path ) {
+		return this.model.createPositionFromPath( root, path );
+	}
+
+	createRange( start, end ) {
+		return this.model.createRange( start, end );
+	}
+
+	createRangeIn( element ) {
+		return this.model.createRangeIn( element );
+	}
+
+	createRangeOn( element ) {
+		return this.model.createRangeOn( element );
+	}
+
+	createSelection( selectable ) {
+		return this.model.createSelection( selectable );
+	}
+
 	/**
 	 * Performs merge action in a detached tree.
 	 *