Parcourir la source

Merge branch t/ckeditor5-engine/532

Internal: Aligned Schema API use to the new Schema API.
Piotrek Koszuliński il y a 8 ans
Parent
commit
59acc50389

+ 3 - 11
packages/ckeditor5-image/src/image/converters.js

@@ -31,7 +31,7 @@ export function viewFigureToModel() {
 		}
 
 		// Do not convert if image cannot be placed in model at this context.
-		if ( !conversionApi.schema.check( { name: 'image', inside: data.context, attributes: 'src' } ) ) {
+		if ( !conversionApi.schema.checkChild( data.context, 'image' ) ) {
 			return;
 		}
 
@@ -197,21 +197,13 @@ function _findAllowedContext( modelData, context, schema ) {
 	// Copy context array so we won't modify original array.
 	context = context.slice();
 
-	// Prepare schema query to check with schema.
-	// Since `inside` property is passed as reference to `context` variable, we don't need to modify `schemaQuery`.
-	const schemaQuery = {
-		name: modelData.name,
-		attributes: modelData.attributes,
-		inside: context
-	};
-
 	// Try out all possible contexts.
-	while ( context.length && !schema.check( schemaQuery ) ) {
+	while ( context.length && !schema.checkChild( context, modelData.name ) ) {
 		const parent = context.pop();
 		const parentName = typeof parent === 'string' ? parent : parent.name;
 
 		// Do not try to autohoist "above" limiting element.
-		if ( schema.limits.has( parentName ) ) {
+		if ( schema.isLimit( parentName ) ) {
 			return null;
 		}
 	}

+ 6 - 4
packages/ckeditor5-image/src/image/imageengine.js

@@ -41,10 +41,12 @@ export default class ImageEngine extends Plugin {
 		const t = editor.t;
 
 		// Configure schema.
-		schema.registerItem( 'image' );
-		schema.requireAttributes( 'image', [ 'src' ] );
-		schema.allow( { name: 'image', attributes: [ 'alt', 'src', 'srcset' ], inside: '$root' } );
-		schema.objects.add( 'image' );
+		schema.register( 'image', {
+			isObject: true,
+			isBlock: true,
+			allowWhere: '$block',
+			allowAttributes: [ 'alt', 'src', 'srcset' ]
+		} );
 
 		// Build converter from model to view for data pipeline.
 		buildModelConverter().for( data.modelToView )

+ 5 - 4
packages/ckeditor5-image/src/imagecaption/imagecaptionengine.js

@@ -59,10 +59,11 @@ export default class ImageCaptionEngine extends Plugin {
 		this._createCaption = captionElementCreator( viewDocument, t( 'Enter image caption' ) );
 
 		// Schema configuration.
-		schema.registerItem( 'caption', '$block' );
-		schema.allow( { name: '$inline', inside: 'caption' } );
-		schema.allow( { name: 'caption', inside: 'image' } );
-		schema.limits.add( 'caption' );
+		schema.register( 'caption', {
+			allowIn: 'image',
+			allowContentOf: '$block',
+			isLimit: true
+		} );
 
 		// Add caption element to each image inserted without it.
 		document.on( 'change', ( evt, type, data, batch ) => this._insertMissingModelCaptionElement( type, data, batch ) );

+ 1 - 4
packages/ckeditor5-image/src/imagestyle/converters.js

@@ -80,10 +80,7 @@ function viewToModelImageStyle( style, data, consumable, conversionApi ) {
 		return;
 	}
 
-	// Check if image element can be placed in current context wit additional attribute.
-	const attributes = [ ...modelImageElement.getAttributeKeys(), 'imageStyle' ];
-
-	if ( !conversionApi.schema.check( { name: 'image', inside: data.context, attributes } ) ) {
+	if ( !conversionApi.schema.checkAttribute( [ ...data.context, 'image' ], 'imageStyle' ) ) {
 		return;
 	}
 

+ 1 - 1
packages/ckeditor5-image/src/imagestyle/imagestyleengine.js

@@ -56,7 +56,7 @@ export default class ImageStyleEngine extends Plugin {
 
 		// Allow imageStyle attribute in image.
 		// We could call it 'style' but https://github.com/ckeditor/ckeditor5-engine/issues/559.
-		schema.allow( { name: 'image', attributes: 'imageStyle', inside: '$root' } );
+		schema.extend( 'image', { allowAttributes: 'imageStyle' } );
 
 		// Converters for imageStyle attribute from model to view.
 		const modelToViewConverter = modelToViewStyleAttribute( styles );

+ 15 - 13
packages/ckeditor5-image/tests/image/converters.js

@@ -34,10 +34,12 @@ describe( 'Image converters', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'image' );
-				schema.requireAttributes( 'image', [ 'src' ] );
-				schema.allow( { name: 'image', attributes: [ 'alt', 'src' ], inside: '$root' } );
-				schema.objects.add( 'image' );
+				schema.register( 'image', {
+					allowWhere: '$block',
+					allowAttributes: [ 'alt', 'src' ],
+					isObject: true,
+					isBlock: true
+				} );
 
 				buildModelConverter().for( editor.editing.modelToView )
 					.fromElement( 'image' )
@@ -59,7 +61,7 @@ describe( 'Image converters', () => {
 			imgConverterCalled = false;
 
 			schema = model.schema;
-			schema.allow( { name: '$text', inside: 'image' } );
+			schema.extend( '$text', { allowIn: 'image' } );
 
 			dispatcher = editor.data.viewToModel;
 			dispatcher.on( 'element:figure', viewFigureToModel() );
@@ -83,10 +85,10 @@ describe( 'Image converters', () => {
 			buildViewConverter().for( editor.data.viewToModel ).fromElement( 'foo' ).toElement( 'foo' );
 			buildViewConverter().for( editor.data.viewToModel ).fromElement( 'bar' ).toElement( 'bar' );
 
-			schema.registerItem( 'foo' );
-			schema.registerItem( 'bar' );
+			schema.register( 'foo' );
+			schema.register( 'bar' );
 
-			schema.allow( { name: 'foo', inside: 'image' } );
+			schema.extend( 'foo', { allowIn: 'image' } );
 
 			editor.setData( '<figure class="image">x<img src="foo.png" />y<foo></foo><bar></bar></figure>' );
 
@@ -196,7 +198,7 @@ describe( 'Image converters', () => {
 
 			dispatcher = editor.data.viewToModel;
 			dispatcher.on( 'element:img', ( evt, data, consumable ) => {
-				if ( !schema.check( { name: 'image', attributes: [ 'src' ], inside: data.context } ) ) {
+				if ( !schema.checkChild( data.context, 'image' ) ) {
 					return;
 				}
 
@@ -255,7 +257,7 @@ describe( 'Image converters', () => {
 			} );
 
 			it( 'should not convert img element if allowed context is "above" limiting element #1', () => {
-				schema.limits.add( 'limit' );
+				schema.register( 'limit', { isLimit: true } );
 
 				const result = dispatcher.convert( viewImg, { context: [ '$root', 'limit', 'div', 'paragraph' ] } );
 
@@ -265,7 +267,7 @@ describe( 'Image converters', () => {
 			} );
 
 			it( 'should not convert img element if allowed context is "above" limiting element #2', () => {
-				schema.limits.add( 'limit' );
+				schema.register( 'limit', { isLimit: true } );
 
 				const result = dispatcher.convert( viewImg, { context: [ '$root', modelLimit, modelDiv, modelParagraph ] } );
 
@@ -277,7 +279,7 @@ describe( 'Image converters', () => {
 
 		describe( 'hoistImageThroughElement', () => {
 			it( 'should hoist img element that was converted by convertHoistableImage', () => {
-				schema.registerItem( 'div', '$block' );
+				schema.register( 'div', { inheritAllFrom: '$block' } );
 
 				buildModelConverter().for( editor.data.modelToView, editor.editing.modelToView ).fromElement( 'div' ).toElement( 'div' );
 				buildViewConverter().for( editor.data.viewToModel ).fromElement( 'div' ).toElement( 'div' );
@@ -301,7 +303,7 @@ describe( 'Image converters', () => {
 			it( 'should work fine with elements that are converted to document fragments', () => {
 				// The example here is <p> that contains some text and an <img> and is converted in $root > div context.
 				// This way we enable autohoisting for <img> and test how it will work when <p> is converted to model document fragment.
-				schema.registerItem( 'div', '$block' );
+				schema.register( 'div', { inheritAllFrom: '$block' } );
 
 				dispatcher.on( 'element:p', convertToModelFragment() );
 				dispatcher.on( 'element:p', hoistImageThroughElement, { priority: 'low' } );

+ 31 - 13
packages/ckeditor5-image/tests/image/imageengine.js

@@ -33,8 +33,15 @@ describe( 'ImageEngine', () => {
 	} );
 
 	it( 'should set proper schema rules', () => {
-		expect( model.schema.check( { name: 'image', attributes: [ 'src', 'alt' ], inside: '$root' } ) ).to.be.true;
-		expect( model.schema.objects.has( 'image' ) ).to.be.true;
+		expect( model.schema.checkChild( [ '$root' ], 'image' ) ).to.be.true;
+		expect( model.schema.checkAttribute( [ '$root', 'image' ], 'src' ) ).to.be.true;
+		expect( model.schema.checkAttribute( [ '$root', 'image' ], 'alt' ) ).to.be.true;
+
+		expect( model.schema.isObject( 'image' ) ).to.be.true;
+
+		expect( model.schema.checkChild( [ '$root', 'image' ], 'image' ) ).to.be.false;
+		expect( model.schema.checkChild( [ '$root', 'image' ], '$text' ) ).to.be.false;
+		expect( model.schema.checkChild( [ '$root', '$block' ], 'image' ) ).to.be.false;
 	} );
 
 	describe( 'conversion in data pipeline', () => {
@@ -171,8 +178,15 @@ describe( 'ImageEngine', () => {
 				const data = editor.data;
 				const editing = editor.editing;
 
-				model.schema.registerItem( 'div', '$block' );
-				model.schema.disallow( { name: 'image', inside: '$root', attributes: 'src' } );
+				model.schema.register( 'div', { inheritAllFrom: '$block' } );
+				model.schema.on( 'checkChild', ( evt, args ) => {
+					const def = model.schema.getDefinition( args[ 1 ] );
+
+					if ( args[ 0 ].endsWith( '$root' ) && def.name == 'image' ) {
+						evt.stop();
+						evt.return = false;
+					}
+				}, { priority: 'high' } );
 
 				buildModelConverter().for( data.modelToView, editing.modelToView ).fromElement( 'div' ).toElement( 'div' );
 				buildViewConverter().for( data.viewToModel ).fromElement( 'div' ).toElement( 'div' );
@@ -227,8 +241,10 @@ describe( 'ImageEngine', () => {
 				const data = editor.data;
 				const editing = editor.editing;
 
-				model.schema.registerItem( 'div', '$block' );
-				model.schema.allow( { name: 'div', attributes: 'alt', inside: '$root' } );
+				model.schema.register( 'div', {
+					inheritAllFrom: '$block',
+					allowAttributes: 'alt'
+				} );
 
 				buildModelConverter().for( data.modelToView, editing.modelToView ).fromElement( 'div' ).toElement( 'div' );
 				buildViewConverter().for( data.viewToModel ).fromElement( 'div' ).toElement( 'div' );
@@ -239,7 +255,7 @@ describe( 'ImageEngine', () => {
 			} );
 
 			it( 'should handle figure with two images', () => {
-				model.schema.allow( { name: '$text', inside: 'image' } );
+				model.schema.extend( '$text', { allowIn: 'image' } );
 
 				editor.setData( '<figure class="image"><img src="foo.jpg" /><img src="bar.jpg" />abc</figure>' );
 
@@ -284,7 +300,7 @@ describe( 'ImageEngine', () => {
 
 			describe( 'should autohoist images', () => {
 				beforeEach( () => {
-					model.schema.registerItem( 'div', '$block' );
+					model.schema.register( 'div', { inheritAllFrom: '$block' } );
 
 					buildModelConverter()
 						.for( editor.data.modelToView, editor.editing.modelToView )
@@ -339,7 +355,7 @@ describe( 'ImageEngine', () => {
 				} );
 
 				it( 'deep autohoisting #1', () => {
-					model.schema.allow( { name: 'div', inside: 'div' } );
+					model.schema.extend( 'div', { allowIn: 'div' } );
 
 					editor.setData( '<div>foo<div>xx<img src="foo.jpg" alt="foo" /></div>bar</div>' );
 
@@ -356,7 +372,7 @@ describe( 'ImageEngine', () => {
 				} );
 
 				it( 'deep autohoisting #2', () => {
-					model.schema.allow( { name: 'div', inside: 'div' } );
+					model.schema.extend( 'div', { allowIn: 'div' } );
 
 					editor.setData(
 						'<div>x</div>' +
@@ -370,9 +386,11 @@ describe( 'ImageEngine', () => {
 				} );
 
 				it( 'should not break a limiting element', () => {
-					model.schema.registerItem( 'limit', '$block' );
-					model.schema.allow( { name: 'div', inside: 'limit' } );
-					model.schema.limits.add( 'limit' );
+					model.schema.register( 'limit', {
+						inheritAllFrom: '$block',
+						isLimit: true
+					} );
+					model.schema.extend( 'div', { allowIn: 'limit' } );
 
 					buildModelConverter()
 						.for( editor.data.modelToView, editor.editing.modelToView ).fromElement( 'limit' ).toElement( 'limit' );

+ 14 - 10
packages/ckeditor5-image/tests/imagecaption/imagecaptionengine.js

@@ -35,10 +35,10 @@ describe( 'ImageCaptionEngine', () => {
 				model = editor.model;
 				doc = model.document;
 				viewDocument = editor.editing.view;
-				model.schema.registerItem( 'widget' );
-				model.schema.allow( { name: 'widget', inside: '$root' } );
-				model.schema.allow( { name: 'caption', inside: 'widget' } );
-				model.schema.allow( { name: '$inline', inside: 'widget' } );
+				model.schema.register( 'widget' );
+				model.schema.extend( 'widget', { allowIn: '$root' } );
+				model.schema.extend( 'caption', { allowIn: 'widget' } );
+				model.schema.extend( '$text', { allowIn: 'widget' } );
 
 				buildViewConverter()
 					.for( editor.data.viewToModel )
@@ -57,23 +57,27 @@ describe( 'ImageCaptionEngine', () => {
 	} );
 
 	it( 'should set proper schema rules', () => {
-		expect( model.schema.check( { name: 'caption', iniside: 'image' } ) ).to.be.true;
-		expect( model.schema.check( { name: '$inline', inside: 'caption' } ) ).to.be.true;
-		expect( model.schema.itemExtends( 'caption', '$block' ) ).to.be.true;
-		expect( model.schema.limits.has( 'caption' ) );
+		expect( model.schema.checkChild( [ '$root', 'image' ], 'caption' ) ).to.be.true;
+		expect( model.schema.checkChild( [ '$root', 'image', 'caption' ], '$text' ) ).to.be.true;
+		expect( model.schema.isLimit( 'caption' ) ).to.be.true;
+
+		expect( model.schema.checkChild( [ '$root', 'image', 'caption' ], 'caption' ) ).to.be.false;
+
+		model.schema.extend( '$block', { allowAttributes: 'aligmnent' } );
+		expect( model.schema.checkAttribute( [ '$root', 'image', 'caption' ], 'alignment' ) ).to.be.false;
 	} );
 
 	describe( 'data pipeline', () => {
 		describe( 'view to model', () => {
 			it( 'should convert figcaption inside image figure', () => {
-				editor.setData( '<figure class="image"><img src="foo.png"/><figcaption>foo bar</figcaption></figure>' );
+				editor.setData( '<figure class="image"><img src="foo.png" /><figcaption>foo bar</figcaption></figure>' );
 
 				expect( getModelData( model, { withoutSelection: true } ) )
 					.to.equal( '<image src="foo.png"><caption>foo bar</caption></image>' );
 			} );
 
 			it( 'should add empty caption if there is no figcaption', () => {
-				editor.setData( '<figure class="image"><img src="foo.png"/></figure>' );
+				editor.setData( '<figure class="image"><img src="foo.png" /></figure>' );
 
 				expect( getModelData( model, { withoutSelection: true } ) )
 					.to.equal( '<image src="foo.png"><caption></caption></image>' );

+ 8 - 6
packages/ckeditor5-image/tests/imagestyle/imagestylecommand.js

@@ -20,12 +20,14 @@ describe( 'ImageStyleCommand', () => {
 				defaultStyleCommand = new ImageStyleCommand( newEditor, defaultStyle );
 				otherStyleCommand = new ImageStyleCommand( newEditor, otherStyle );
 
-				model.schema.registerItem( 'p', '$block' );
-
-				model.schema.registerItem( 'image' );
-				model.schema.objects.add( 'image' );
-				model.schema.allow( { name: 'image', inside: '$root' } );
-				model.schema.allow( { name: 'image', inside: '$root', attributes: [ 'imageStyle' ] } );
+				model.schema.register( 'p', { inheritAllFrom: '$block' } );
+
+				model.schema.register( 'image', {
+					isObject: true,
+					isBlock: true,
+					allowWhere: '$block',
+					allowAttributes: 'imageStyle'
+				} );
 			} );
 	} );
 

+ 8 - 2
packages/ckeditor5-image/tests/imagestyle/imagestyleengine.js

@@ -84,7 +84,7 @@ describe( 'ImageStyleEngine', () => {
 		it( 'should set schema rules for image style', () => {
 			const schema = model.schema;
 
-			expect( schema.check( { name: 'image', attributes: [ 'imageStyle', 'src' ], inside: '$root' } ) ).to.be.true;
+			expect( schema.checkAttribute( [ '$root', 'image' ], 'imageStyle' ) ).to.be.true;
 		} );
 
 		it( 'should register separate command for each style', () => {
@@ -122,7 +122,13 @@ describe( 'ImageStyleEngine', () => {
 		} );
 
 		it( 'should not convert from view to model if schema prevents it', () => {
-			model.schema.disallow( { name: 'image', attributes: 'imageStyle' } );
+			model.schema.on( 'checkAttribute', ( evt, args ) => {
+				if ( args[ 0 ].endsWith( 'image' ) && args[ 1 ] == 'imageStyle' ) {
+					evt.stop();
+					evt.return = false;
+				}
+			} );
+
 			editor.setData( '<figure class="image side-class"><img src="foo.png" /></figure>' );
 
 			expect( getModelData( model, { withoutSelection: true } ) ).to.equal( '<image src="foo.png"></image>' );

+ 8 - 6
packages/ckeditor5-image/tests/imagetextalternative/imagetextalternativecommand.js

@@ -16,12 +16,14 @@ describe( 'ImageTextAlternativeCommand', () => {
 				model = newEditor.model;
 				command = new ImageTextAlternativeCommand( newEditor );
 
-				model.schema.registerItem( 'p', '$block' );
-
-				model.schema.registerItem( 'image' );
-				model.schema.requireAttributes( 'image', [ 'src' ] );
-				model.schema.allow( { name: 'image', attributes: [ 'alt', 'src' ], inside: '$root' } );
-				model.schema.objects.add( 'image' );
+				model.schema.register( 'p', { inheritAllFrom: '$block' } );
+
+				model.schema.register( 'image', {
+					allowWhere: '$block',
+					isObject: true,
+					isBlock: true,
+					alllowAttributes: [ 'alt', 'src' ]
+				} );
 			} );
 	} );