8
0
Pārlūkot izejas kodu

Added treeView.Range.isIntersecting.

Szymon Kupś 9 gadi atpakaļ
vecāks
revīzija
7efc392661

+ 10 - 0
packages/ckeditor5-engine/src/treeview/range.js

@@ -58,6 +58,16 @@ export default class Range {
 	}
 
 	/**
+	 * Checks and returns whether this range intersects with given range.
+	 *
+	 * @param {engine.treeView.Range} otherRange Range to compare with.
+	 * @returns {Boolean} True if ranges intersect.
+	 */
+	isIntersecting( otherRange ) {
+		return this.start.isBefore( otherRange.end ) && this.end.isAfter( otherRange.start );
+	}
+
+	/**
 	 * Creates a range from given parents and offsets.
 	 *
 	 * @param {engine.treeView.Element} startElement Start position parent element.

+ 69 - 0
packages/ckeditor5-engine/tests/treeview/range.js

@@ -9,6 +9,8 @@
 
 import Range from '/ckeditor5/engine/treeview/range.js';
 import Position from '/ckeditor5/engine/treeview/position.js';
+import Element from '/ckeditor5/engine/treeview/element.js';
+import Text from '/ckeditor5/engine/treeview/text.js';
 
 describe( 'Range', () => {
 	describe( 'constructor', () => {
@@ -74,6 +76,73 @@ describe( 'Range', () => {
 		} );
 	} );
 
+	describe( 'isIntersecting', () => {
+		let root, p1, p2, t1, t2, t3;
+
+		//            root
+		//    __________|__________
+		//    |                   |
+		// ___p1___               p2
+		// |       |              |
+		// t1      t2             t3
+
+		beforeEach( () => {
+			t1 = new Text( 'foo' );
+			t2 = new Text( 'bar' );
+			t3 = new Text( 'baz' );
+			p1 = new Element( 'p', null, [ t1, t2 ] );
+			p2 = new Element( 'p', null, t3 );
+			root = new Element( 'div', null, [ p1, p2 ] );
+		} );
+
+		it( 'should return true if given range is equal', () => {
+			const range = Range.createFromParentsAndOffsets( t1, 0, t3, 2 );
+			const otherRange = Range.createFromRange( range );
+			expect( range.isIntersecting( otherRange ) ).to.be.true;
+			expect( otherRange.isIntersecting( range ) ).to.be.true;
+		} );
+
+		it( 'should return true if given range contains this range', () => {
+			const range = Range.createFromParentsAndOffsets( t1, 0, t3, 3 );
+			const otherRange = Range.createFromParentsAndOffsets( p1, 1, t2, 2 );
+
+			expect( range.isIntersecting( otherRange ) ).to.be.true;
+			expect( otherRange.isIntersecting( range ) ).to.be.true;
+		} );
+
+		it( 'should return true if given range ends in this range', () => {
+			const range = Range.createFromParentsAndOffsets( root, 1, t3, 3 );
+			const otherRange = Range.createFromParentsAndOffsets( t1, 0, p2, 0 );
+
+			expect( range.isIntersecting( otherRange ) ).to.be.true;
+			expect( otherRange.isIntersecting( range ) ).to.be.true;
+		} );
+
+		it( 'should return true if given range starts in this range', () => {
+			const range = Range.createFromParentsAndOffsets( t1, 0, t2, 3 );
+			const otherRange = Range.createFromParentsAndOffsets( p1, 1, p2, 0 );
+
+			expect( range.isIntersecting( otherRange ) ).to.be.true;
+			expect( otherRange.isIntersecting( range ) ).to.be.true;
+		} );
+
+		it( 'should return false if given range is fully before/after this range', () => {
+			const range = Range.createFromParentsAndOffsets( t1, 0, t2, 3 );
+			const otherRange = Range.createFromParentsAndOffsets( root, 1, t3, 0 );
+
+			expect( range.isIntersecting( otherRange ) ).to.be.false;
+			expect( otherRange.isIntersecting( range ) ).to.be.false;
+		} );
+
+		it( 'should return false if ranges are in different roots', () => {
+			const range = Range.createFromParentsAndOffsets( t1, 0, t2, 3 );
+			const otherRange = Range.createFromParentsAndOffsets( new Element( 'div' ), 1, t3, 0 );
+
+			expect( range.isIntersecting( otherRange ) ).to.be.false;
+			expect( otherRange.isIntersecting( range ) ).to.be.false;
+		} );
+	} );
+
 	describe( 'createFromRange', () => {
 		it( 'should create a new instance of Range that is equal to passed range', () => {
 			const range = new Range( new Position( {}, 0 ), new Position( {}, 1 ) );