8
0
Просмотр исходного кода

Fixed auto-paragraphing of inline objects (WIP).

Kuba Niegowski 5 лет назад
Родитель
Сommit
56ff10c5e9

+ 23 - 0
packages/ckeditor5-paragraph/src/paragraph.js

@@ -70,6 +70,29 @@ export default class Paragraph extends Plugin {
 			converterPriority: 'low'
 		} );
 
+		const conversionApi = data.upcastDispatcher.conversionApi;
+		const originalSplitToAllowedParent = conversionApi.splitToAllowedParent;
+
+		conversionApi.splitToAllowedParent = ( node, modelCursor ) => {
+			const result = originalSplitToAllowedParent( node, modelCursor );
+
+			if ( result ) {
+				return result;
+			}
+
+			if ( !isParagraphable( node, modelCursor, conversionApi.schema ) ) {
+				return null;
+			}
+
+			const paragraph = conversionApi.writer.createElement( 'paragraph' );
+
+			conversionApi.writer.insert( paragraph, modelCursor );
+
+			return {
+				position: conversionApi.writer.createPositionAt( paragraph, 0 )
+			};
+		};
+
 		data.upcastDispatcher.on( 'element', ( evt, data, conversionApi ) => {
 			// Do not try auto-paragraphing if the element was already converted.
 			if ( !conversionApi.consumable.test( data.viewItem, { name: data.viewItem.name } ) ) {

+ 18 - 5
packages/ckeditor5-paragraph/tests/paragraph.js

@@ -76,18 +76,31 @@ describe( 'Paragraph feature', () => {
 			} );
 
 			it( 'should autoparagraph any inline element', () => {
-				editor.model.schema.register( 'span', { allowWhere: '$text' } );
-				editor.model.schema.extend( '$text', { allowIn: 'span' } );
+				editor.model.schema.register( 'inline', { allowWhere: '$text' } );
+				editor.model.schema.extend( '$text', { allowIn: 'inline' } );
 
-				editor.conversion.for( 'downcast' ).elementToElement( { model: 'span', view: 'span' } );
-				editor.conversion.for( 'upcast' ).elementToElement( { model: 'span', view: 'span' } );
+				editor.conversion.for( 'downcast' ).elementToElement( { model: 'inline', view: 'span' } );
+				editor.conversion.for( 'upcast' ).elementToElement( { model: 'inline', view: 'span' } );
 
 				editor.setData( '<span>foo</span>' );
 
-				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( '<paragraph><span>foo</span></paragraph>' );
+				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( '<paragraph><inline>foo</inline></paragraph>' );
 				expect( editor.getData() ).to.equal( '<p><span>foo</span></p>' );
 			} );
 
+			it( 'should autoparagraph any inline element with children', () => {
+				editor.model.schema.register( 'inline', { allowWhere: '$text' } );
+				editor.model.schema.extend( '$text', { allowIn: 'inline' } );
+
+				editor.conversion.for( 'downcast' ).elementToElement( { model: 'inline', view: 'span' } );
+				editor.conversion.for( 'upcast' ).elementToElement( { model: 'inline', view: 'span' } );
+
+				editor.setData( '<span>f<b>123</b>oo</span>' );
+
+				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( '<paragraph><inline>f123oo</inline></paragraph>' );
+				expect( editor.getData() ).to.equal( '<p><span>f123oo</span></p>' );
+			} );
+
 			it( 'should not autoparagraph text (in clipboard holder)', () => {
 				const modelFragment = editor.data.parse( 'foo', [ '$clipboardHolder' ] );