ソースを参照

Mapper#toViewRange, Mapper#toModelRange.

Piotr Jasiun 9 年 前
コミット
7fbca8b7a0

+ 22 - 0
packages/ckeditor5-engine/src/treecontroller/mapper.js

@@ -7,6 +7,8 @@
 
 import ModelPosition from '../treemodel/position.js';
 import ViewPosition from '../treeview/position.js';
+import ModelRange from '../treemodel/range.js';
+import ViewRange from '../treeview/range.js';
 import ViewText from '../treeview/text.js';
 
 /**
@@ -73,6 +75,26 @@ export default class Mapper {
 		return this._modelToViewMapping.get( modelElement );
 	}
 
+	/**
+	 * Gets the corresponding model range.
+	 *
+	 * @param {core.treeView.Range} viewRange View range.
+	 * @returns {core.treeModel.Range} Corresponding model range.
+	 */
+	toModelRange( viewRange ) {
+		return new ModelRange( this.toModelPosition( viewRange.start ), this.toModelPosition( viewRange.end ) );
+	}
+
+	/**
+	 * Gets the corresponding view range.
+	 *
+	 * @param {core.treeModel.Range} modelRange Model range.
+	 * @returns {core.treeView.Range} Corresponding view range.
+	 */
+	toViewRange( modelRange ) {
+		return new ViewRange( this.toViewPosition( modelRange.start ), this.toViewPosition( modelRange.end ) );
+	}
+
 	/**
 	 * Gets the corresponding model position.
 	 *

+ 31 - 7
packages/ckeditor5-engine/tests/treecontroller/mapper.js

@@ -9,14 +9,16 @@
 
 import Mapper from '/ckeditor5/engine/treecontroller/mapper.js';
 
-import ModelElement from '/ckeditor5/engine/treemodel/element.js';
-import ModelRootElement from '/ckeditor5/engine/treemodel/rootelement.js';
-import ModelText from '/ckeditor5/engine/treemodel/text.js';
-import ModelPosition from '/ckeditor5/engine/treemodel/position.js';
+import ModelElement from '/ckeditor5/core/treemodel/element.js';
+import ModelRootElement from '/ckeditor5/core/treemodel/rootelement.js';
+import ModelText from '/ckeditor5/core/treemodel/text.js';
+import ModelPosition from '/ckeditor5/core/treemodel/position.js';
+import ModelRange from '/ckeditor5/core/treemodel/range.js';
 
-import ViewElement from '/ckeditor5/engine/treeview/element.js';
-import ViewText from '/ckeditor5/engine/treeview/text.js';
-import ViewPosition from '/ckeditor5/engine/treeview/position.js';
+import ViewElement from '/ckeditor5/core/treeview/element.js';
+import ViewText from '/ckeditor5/core/treeview/text.js';
+import ViewPosition from '/ckeditor5/core/treeview/position.js';
+import ViewRange from '/ckeditor5/core/treeview/range.js';
 
 describe( 'Mapper', () => {
 	let modelDiv, modelP, modelImg;
@@ -211,6 +213,28 @@ describe( 'Mapper', () => {
 		it( 'should transform modelP 10', () => createToViewTest( modelP, 10, viewU, 2 ) );
 		it( 'should transform modelP 11', () => createToViewTest( modelP, 11, viewP, 5 ) );
 	} );
+
+	describe( 'toModelRange', () => {
+		it( 'should transform range', () => {
+			const viewRange = ViewRange.createFromParentsAndOffsets( viewDiv, 0, viewTextFOO, 2 );
+			const modelRange = mapper.toModelRange( viewRange );
+			expect( modelRange.start.parent ).to.equal( modelDiv );
+			expect( modelRange.start.offset ).to.equal( 0 );
+			expect( modelRange.end.parent ).to.equal( modelP );
+			expect( modelRange.end.offset ).to.equal( 3 );
+		} );
+	} );
+
+	describe( 'toViewRange', () => {
+		it( 'should transform range', () => {
+			const modelRange = ModelRange.createFromParentsAndOffsets( modelDiv, 0, modelP, 3 );
+			const viewRange = mapper.toViewRange( modelRange );
+			expect( viewRange.start.parent ).to.equal( viewDiv );
+			expect( viewRange.start.offset ).to.equal( 0 );
+			expect( viewRange.end.parent ).to.equal( viewTextFOO );
+			expect( viewRange.end.offset ).to.equal( 2 );
+		} );
+	} );
 } );
 
 describe( 'Mapper for widget', () => {