Răsfoiți Sursa

Changed: `view.Range#getTrimmed` should collapse range at the end of container element if there is no data in that container element.

Szymon Cofalik 8 ani în urmă
părinte
comite
fabf372eb3

+ 11 - 6
packages/ckeditor5-engine/src/view/range.js

@@ -49,7 +49,7 @@ export default class Range {
 	 *
 	 *
 	 * @returns {Iterable.<module:engine/view/treewalker~TreeWalkerValue>}
 	 * @returns {Iterable.<module:engine/view/treewalker~TreeWalkerValue>}
 	 */
 	 */
-	*[ Symbol.iterator ]() {
+	* [ Symbol.iterator ]() {
 		yield* new TreeWalker( { boundaries: this, ignoreElementEnd: true } );
 		yield* new TreeWalker( { boundaries: this, ignoreElementEnd: true } );
 	}
 	}
 
 
@@ -130,8 +130,13 @@ export default class Range {
 	 * @returns {module:engine/view/range~Range} Shrink range.
 	 * @returns {module:engine/view/range~Range} Shrink range.
 	 */
 	 */
 	getTrimmed() {
 	getTrimmed() {
-		let start = this.start.getLastMatchingPosition( enlargeTrimSkip, { boundaries: new Range( this.start, this.end ) } );
-		let end = this.end.getLastMatchingPosition( enlargeTrimSkip, { boundaries: new Range( start, this.end ), direction: 'backward' } );
+		let start = this.start.getLastMatchingPosition( enlargeTrimSkip );
+
+		if ( start.isAfter( this.end ) || start.isEqual( this.end ) ) {
+			return new Range( start, start );
+		}
+
+		let end = this.end.getLastMatchingPosition( enlargeTrimSkip, { direction: 'backward' } );
 		const nodeAfterStart = start.nodeAfter;
 		const nodeAfterStart = start.nodeAfter;
 		const nodeBeforeEnd = end.nodeBefore;
 		const nodeBeforeEnd = end.nodeBefore;
 
 
@@ -328,7 +333,7 @@ export default class Range {
 	 * @param {Object} options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.
 	 * @param {Object} options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.
 	 * @returns {Iterable.<module:engine/view/item~Item>}
 	 * @returns {Iterable.<module:engine/view/item~Item>}
 	 */
 	 */
-	*getItems( options = {} ) {
+	* getItems( options = {} ) {
 		options.boundaries = this;
 		options.boundaries = this;
 		options.ignoreElementEnd = true;
 		options.ignoreElementEnd = true;
 
 
@@ -352,7 +357,7 @@ export default class Range {
 	 * @param {Object} options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.
 	 * @param {Object} options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.
 	 * @returns {Iterable.<module:engine/view/position~Position>}
 	 * @returns {Iterable.<module:engine/view/position~Position>}
 	 */
 	 */
-	*getPositions( options = {} ) {
+	* getPositions( options = {} ) {
 		options.boundaries = this;
 		options.boundaries = this;
 
 
 		const treeWalker = new TreeWalker( options );
 		const treeWalker = new TreeWalker( options );
@@ -437,7 +442,7 @@ export default class Range {
 	}
 	}
 }
 }
 
 
-// Function used by getEnlagred and getShrinked methods.
+// Function used by getEnlagred and getTrimmed methods.
 function enlargeTrimSkip( value ) {
 function enlargeTrimSkip( value ) {
 	if ( value.item.is( 'attributeElement' ) || value.item.is( 'uiElement' ) ) {
 	if ( value.item.is( 'attributeElement' ) || value.item.is( 'uiElement' ) ) {
 		return true;
 		return true;

+ 7 - 1
packages/ckeditor5-engine/tests/view/range.js

@@ -183,7 +183,7 @@ describe( 'Range', () => {
 		// As above.
 		// As above.
 		it( 'case 9', () => {
 		it( 'case 9', () => {
 			expect( trim( '<p><b></b>[<b></b>]<b></b></p>' ) )
 			expect( trim( '<p><b></b>[<b></b>]<b></b></p>' ) )
-				.to.equal( '<p><b></b><b></b>[]<b></b></p>' );
+				.to.equal( '<p><b></b><b></b><b></b>[]</p>' );
 		} );
 		} );
 
 
 		// As above.
 		// As above.
@@ -192,6 +192,12 @@ describe( 'Range', () => {
 				.to.equal( '<p><b></b><b></b>[]</p>' );
 				.to.equal( '<p><b></b><b></b>[]</p>' );
 		} );
 		} );
 
 
+		// As above.
+		it( 'case 11', () => {
+			expect( trim( '<p><b></b><b>[]</b><b></b></p>' ) )
+				.to.equal( '<p><b></b><b></b><b></b>[]</p>' );
+		} );
+
 		function trim( data ) {
 		function trim( data ) {
 			data = data
 			data = data
 				.replace( /<p>/g, '<container:p>' )
 				.replace( /<p>/g, '<container:p>' )