Bladeren bron

Simplify table cell upcast converter.

Maciej Gołaszewski 5 jaren geleden
bovenliggende
commit
e53eefe9f7
2 gewijzigde bestanden met toevoegingen van 19 en 39 verwijderingen
  1. 14 36
      packages/ckeditor5-table/src/converters/upcasttable.js
  2. 5 3
      packages/ckeditor5-table/src/tableediting.js

+ 14 - 36
packages/ckeditor5-table/src/converters/upcasttable.js

@@ -111,50 +111,28 @@ export function skipEmptyTableRow() {
 	};
 }
 
-export function upcastTableCell( elementName ) {
+/**
+ * Converter that ensures empty paragraph is inserted in a table cell if no other content was converted.
+ *
+ * @returns {Function} Conversion helper.
+ */
+export function ensureParagraphInTableCell( elementName ) {
 	return dispatcher => {
 		dispatcher.on( `element:${ elementName }`, ( evt, data, conversionApi ) => {
-			const viewTableCell = data.viewItem;
-
-			// When element was already consumed then skip it.
-			if ( !conversionApi.consumable.test( viewTableCell, { name: true } ) ) {
-				return;
-			}
-
-			const tableCell = conversionApi.writer.createElement( 'tableCell' );
-
-			// Insert element on allowed position.
-			const splitResult = conversionApi.splitToAllowedParent( tableCell, data.modelCursor );
-
-			// When there is no split result it means that we can't insert element to model tree, so let's skip it.
-			if ( !splitResult ) {
+			// The default converter will create a model range on converted table cell.
+			if ( !data.modelRange ) {
 				return;
 			}
 
-			conversionApi.writer.insert( tableCell, splitResult.position );
-			conversionApi.consumable.consume( viewTableCell, { name: true } );
+			const tableCell = data.modelRange.start.nodeAfter;
 
-			conversionApi.convertChildren( viewTableCell, tableCell );
-
-			// Ensure a paragraph in the model for empty table cells.
+			// Ensure a paragraph in the model for empty table cells for converted table cells.
 			if ( !tableCell.childCount ) {
-				conversionApi.writer.insertElement( 'paragraph', tableCell, 0 );
-			}
+				const modelCursor = conversionApi.writer.createPositionAt( tableCell, 0 );
 
-			// Set conversion result range.
-			data.modelRange = conversionApi.writer.createRange(
-				// Range should start before inserted element
-				conversionApi.writer.createPositionBefore( tableCell ),
-				// 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>
-				conversionApi.writer.createPositionAfter( tableCell )
-			);
-
-			// Continue after inserted element.
-			data.modelCursor = data.modelRange.end;
-		} );
+				conversionApi.writer.insertElement( 'paragraph', modelCursor );
+			}
+		}, { priority: 'low' } );
 	};
 }
 

+ 5 - 3
packages/ckeditor5-table/src/tableediting.js

@@ -9,7 +9,7 @@
 
 import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 
-import upcastTable, { upcastTableCell, skipEmptyTableRow } from './converters/upcasttable';
+import upcastTable, { ensureParagraphInTableCell, skipEmptyTableRow } from './converters/upcasttable';
 import {
 	downcastInsertCell,
 	downcastInsertRow,
@@ -104,8 +104,10 @@ export default class TableEditing extends Plugin {
 		conversion.for( 'editingDowncast' ).add( downcastRemoveRow() );
 
 		// Table cell conversion.
-		conversion.for( 'upcast' ).add( upcastTableCell( 'td' ) );
-		conversion.for( 'upcast' ).add( upcastTableCell( 'th' ) );
+		conversion.for( 'upcast' ).elementToElement( { model: 'tableCell', view: 'td' } );
+		conversion.for( 'upcast' ).elementToElement( { model: 'tableCell', view: 'th' } );
+		conversion.for( 'upcast' ).add( ensureParagraphInTableCell( 'td' ) );
+		conversion.for( 'upcast' ).add( ensureParagraphInTableCell( 'th' ) );
 
 		conversion.for( 'editingDowncast' ).add( downcastInsertCell() );