Selaa lähdekoodia

Added static method consumablesFromElement to treeController.ViewConsumable.

Szymon Kupś 9 vuotta sitten
vanhempi
sitoutus
47a790b9d2

+ 42 - 0
packages/ckeditor5-engine/src/treecontroller/viewconsumable.js

@@ -441,4 +441,46 @@ export default class ViewConsumable {
 			elementConsumables.revert( consumables );
 		}
 	}
+
+	/**
+	 * Creates consumable object from {@link engine.treeView.Element view Element}. Consumable object will include
+	 * element's name and all its attributes, classes and styles.
+	 *
+	 * @static
+	 * @param {engine.treeView.Element} element
+	 * @returns {Object} consumables
+	 */
+	static consumablesFromElement( element ) {
+		const consumables = {
+			name: true,
+			attribute: [],
+			class: [],
+			style: []
+		};
+
+		const attributes = element.getAttributeKeys();
+
+		for ( let attribute of attributes ) {
+			// Skip classes and styles - will be added separately.
+			if ( attribute == 'style' || attribute == 'class' ) {
+				continue;
+			}
+
+			consumables.attribute.push( attribute );
+		}
+
+		const classes = element.getClassNames();
+
+		for ( let className of classes ) {
+			consumables.class.push( className );
+		}
+
+		const styles = element.getStyleNames();
+
+		for ( let style of styles ) {
+			consumables.style.push( style );
+		}
+
+		return consumables;
+	}
 }

+ 56 - 0
packages/ckeditor5-engine/tests/treecontroller/viewconsumable.js

@@ -363,4 +363,60 @@ describe( 'ViewConsumable', () => {
 			} ).to.throw( 'viewconsumable-invalid-attribute' );
 		} );
 	} );
+
+	describe( 'consumablesFromElement', () => {
+		it( 'should create consumable object from element', () => {
+			const consumables = ViewConsumable.consumablesFromElement( el );
+
+			expect( consumables ).to.be.an( 'object' );
+			expect( consumables.name ).to.be.true;
+			expect( consumables.attribute ).to.be.an( 'array' );
+			expect( consumables.attribute.length ).to.equal( 0 );
+			expect( consumables.class ).to.be.an( 'array' );
+			expect( consumables.class.length ).to.equal( 0 );
+			expect( consumables.style ).to.be.an( 'array' );
+			expect( consumables.style.length ).to.equal( 0 );
+		} );
+
+		it( 'should add all attributes', () => {
+			el.setAttribute( 'title', 'foobar' );
+			el.setAttribute( 'href', 'https://ckeditor.com' );
+
+			const consumables = ViewConsumable.consumablesFromElement( el );
+			expect( consumables.attribute.length ).to.equal( 2 );
+			expect( consumables.attribute.indexOf( 'title' ) > -1 ).to.be.true;
+			expect( consumables.attribute.indexOf( 'href' ) > -1 ).to.be.true;
+			expect( consumables.class.length ).to.equal( 0 );
+			expect( consumables.style.length ).to.equal( 0 );
+			expect( consumables.name ).to.be.true;
+		} );
+
+		it( 'should add all classes', () => {
+			el.addClass( 'foo', 'bar', 'baz' );
+
+			const consumables = ViewConsumable.consumablesFromElement( el );
+			expect( consumables.class.length ).to.equal( 3 );
+			expect( consumables.class.indexOf( 'foo' ) > -1 ).to.be.true;
+			expect( consumables.class.indexOf( 'bar' ) > -1 ).to.be.true;
+			expect( consumables.class.indexOf( 'baz' ) > -1 ).to.be.true;
+			expect( consumables.attribute.length ).to.equal( 0 );
+			expect( consumables.style.length ).to.equal( 0 );
+			expect( consumables.name ).to.be.true;
+		} );
+
+		it( 'should add all styles', () => {
+			el.setStyle( {
+				color: 'red',
+				position: 'absolute'
+			} );
+
+			const consumables = ViewConsumable.consumablesFromElement( el );
+			expect( consumables.style.length ).to.equal( 2 );
+			expect( consumables.style.indexOf( 'color' ) > -1 ).to.be.true;
+			expect( consumables.style.indexOf( 'position' ) > -1 ).to.be.true;
+			expect( consumables.attribute.length ).to.equal( 0 );
+			expect( consumables.class.length ).to.equal( 0 );
+			expect( consumables.name ).to.be.true;
+		} );
+	} );
 } );