Ver Fonte

It should trim copied table that exceeds rectangular selection.

Maciej Gołaszewski há 5 anos atrás
pai
commit
5569d3a6e6

+ 37 - 0
packages/ckeditor5-table/src/tableselection.js

@@ -227,6 +227,43 @@ export default class TableSelection extends Plugin {
 				writer.append( tableCell._clone( true ), rowsMap.get( row ) );
 			}
 
+			// Fix table;
+
+			const { row: startRow, column: startColumn } = this._tableUtils.getCellLocation( this._startElement );
+			const { row: endRow, column: endColumn } = this._tableUtils.getCellLocation( this._endElement );
+
+			const width = endColumn - startColumn + 1;
+			const height = endRow - startRow + 1;
+
+			for ( const row of table.getChildren() ) {
+				for ( const tableCell of row.getChildren() ) {
+					const colspan = parseInt( tableCell.getAttribute( 'colspan' ) || 1 );
+					const rowspan = parseInt( tableCell.getAttribute( 'rowspan' ) || 1 );
+
+					const { row, column } = this._tableUtils.getCellLocation( tableCell );
+
+					if ( column + colspan > width ) {
+						const newSpan = width - column;
+
+						if ( newSpan > 1 ) {
+							writer.setAttribute( 'colspan', newSpan, tableCell );
+						} else {
+							writer.removeAttribute( 'colspan', tableCell );
+						}
+					}
+
+					if ( row + rowspan > height ) {
+						const newSpan = height - row;
+
+						if ( newSpan > 1 ) {
+							writer.setAttribute( 'rowspan', newSpan, tableCell );
+						} else {
+							writer.removeAttribute( 'rowspan', tableCell );
+						}
+					}
+				}
+			}
+
 			return fragment;
 		} );
 	}

+ 102 - 0
packages/ckeditor5-table/tests/tableselection-clipboard.js

@@ -81,6 +81,108 @@ describe( 'table selection', () => {
 					preventDefault: preventDefaultSpy
 				} );
 			} );
+
+			it( 'should fix selected table (cell has colspan that exceeds rectangular selection by 1)', done => {
+				setModelData( model, modelTable( [
+					[ '11[]', '12', '13' ],
+					[ '21', { contents: '22', colspan: 2 } ],
+					[ '31', '32', '33' ]
+				] ) );
+
+				tableSelection.startSelectingFrom( modelRoot.getNodeByPath( [ 0, 0, 0 ] ) );
+				tableSelection.setSelectingTo( modelRoot.getNodeByPath( [ 0, 2, 1 ] ) );
+
+				viewDocument.on( 'clipboardOutput', ( evt, data ) => {
+					expect( stringifyView( data.content ) ).to.equal( viewTable( [
+						[ '11', '12' ],
+						[ '21', '22' ],
+						[ '31', '32' ]
+					] ) );
+
+					done();
+				} );
+
+				viewDocument.fire( 'copy', {
+					dataTransfer: createDataTransfer(),
+					preventDefault: sinon.spy()
+				} );
+			} );
+
+			it( 'should fix selected table (cell has colspan that exceeds rectangular selection but spans over selection)', done => {
+				setModelData( model, modelTable( [
+					[ '11[]', '12', '13' ],
+					[ { contents: '21', colspan: 3 } ],
+					[ '31', '32', '33' ]
+				] ) );
+
+				tableSelection.startSelectingFrom( modelRoot.getNodeByPath( [ 0, 0, 0 ] ) );
+				tableSelection.setSelectingTo( modelRoot.getNodeByPath( [ 0, 2, 1 ] ) );
+
+				viewDocument.on( 'clipboardOutput', ( evt, data ) => {
+					expect( stringifyView( data.content ) ).to.equal( viewTable( [
+						[ '11', '12' ],
+						[ { contents: '21', colspan: 2 } ],
+						[ '31', '32' ]
+					] ) );
+
+					done();
+				} );
+
+				viewDocument.fire( 'copy', {
+					dataTransfer: createDataTransfer(),
+					preventDefault: sinon.spy()
+				} );
+			} );
+
+			it( 'should fix selected table (cell has rowspan that exceeds rectangular selection by 1)', done => {
+				setModelData( model, modelTable( [
+					[ '11[]', '12', '13' ],
+					[ '21', { contents: '22', rowspan: 2 }, '23' ],
+					[ '31', '32', '33' ]
+				] ) );
+
+				tableSelection.startSelectingFrom( modelRoot.getNodeByPath( [ 0, 0, 0 ] ) );
+				tableSelection.setSelectingTo( modelRoot.getNodeByPath( [ 0, 1, 2 ] ) );
+
+				viewDocument.on( 'clipboardOutput', ( evt, data ) => {
+					expect( stringifyView( data.content ) ).to.equal( viewTable( [
+						[ '11', '12', '13' ],
+						[ '21', '22', '23' ]
+					] ) );
+
+					done();
+				} );
+
+				viewDocument.fire( 'copy', {
+					dataTransfer: createDataTransfer(),
+					preventDefault: sinon.spy()
+				} );
+			} );
+
+			it( 'should fix selected table (cell has rowspan that exceeds rectangular selection but spans over selection)', done => {
+				setModelData( model, modelTable( [
+					[ '11[]', { contents: '12', rowspan: 3 }, '13' ],
+					[ '21', '23' ],
+					[ '31', '33' ]
+				] ) );
+
+				tableSelection.startSelectingFrom( modelRoot.getNodeByPath( [ 0, 0, 0 ] ) );
+				tableSelection.setSelectingTo( modelRoot.getNodeByPath( [ 0, 1, 1 ] ) );
+
+				viewDocument.on( 'clipboardOutput', ( evt, data ) => {
+					expect( stringifyView( data.content ) ).to.equal( viewTable( [
+						[ '11', { contents: '12', rowspan: 2 }, '13' ],
+						[ '21', '23' ]
+					] ) );
+
+					done();
+				} );
+
+				viewDocument.fire( 'copy', {
+					dataTransfer: createDataTransfer(),
+					preventDefault: sinon.spy()
+				} );
+			} );
 		} );
 
 		describe( 'cut', () => {