text: /**
   * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
   * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
   */
  
  /**
   * @module image/image/converters
   */
  
  import first from '@ckeditor/ckeditor5-utils/src/first';
  import { getViewImgFromWidget } from './utils';
  
  /**
   * Returns a function that converts the image view representation:
   *
   *		<figure class="image"><img src="..." alt="..."></img></figure>
   *
   * to the model representation:
   *
   *		<image src="..." alt="..."></image>
   *
   * The entire content of the `<figure>` element except the first `<img>` is being converted as children
   * of the `<image>` model element.
   *
   * @returns {Function}
   */
  export function viewFigureToModel() {
  	return dispatcher => {
  		dispatcher.on( 'element:figure', converter );
  	};
  
  	function converter( evt, data, conversionApi ) {
  		// Do not convert if this is not an "image figure".
  		if ( !conversionApi.consumable.test( data.viewItem, { name: true, classes: 'image' } ) ) {
  			return;
  		}
  
  		// Find an image element inside the figure element.
  		const viewImage = getViewImgFromWidget( data.viewItem );
  
  		// Do not convert if image element is absent, is missing src attribute or was already converted.
  		if ( !viewImage || !viewImage.hasAttribute( 'src' ) || !conversionApi.consumable.test( viewImage, { name: true } ) ) {
  			return;
  		}
  
  		// Convert view image to model image.
  		const conversionResult = conversionApi.convertItem( viewImage, data.modelCursor );
  
  		// Get image element from conversion result.
  		const modelImage = first( conversionResult.modelRange.getItems() );
  
  		// When image wasn't successfully converted then finish conversion.
  		if ( !modelImage ) {
  			return;
  		}
  
  		// Convert rest of the figure element's children as an image children.
  		conversionApi.convertChildren( data.viewItem, conversionApi.writer.createPositionAt( modelImage, 0 ) );
  
  		// Set image range as conversion result.
  		data.modelRange = conversionResult.modelRange;
  
  		// Continue conversion where image conversion ends.
  		data.modelCursor = conversionResult.modelCursor;
  	}
  }
  
  /**
   * Converter used to convert the `srcset` model image attribute to the `srcset`, `sizes` and `width` attributes in the view.
   *
   * @returns {Function}
   */
  export function srcsetAttributeConverter() {
  	return dispatcher => {
  		dispatcher.on( 'attribute:srcset:image', converter );
  	};
  
  	function converter( evt, data, conversionApi ) {
  		if ( !conversionApi.consumable.consume( data.item, evt.name ) ) {
  			return;
  		}
  
  		const writer = conversionApi.writer;
  		const figure = conversionApi.mapper.toViewElement( data.item );
  		const img = getViewImgFromWidget( figure );
  
  		if ( data.attributeNewValue === null ) {
  			const srcset = data.attributeOldValue;
  
  			if ( srcset.data ) {
  				writer.removeAttribute( 'srcset', img );
  				writer.removeAttribute( 'sizes', img );
  
  				if ( srcset.width ) {
  					writer.removeAttribute( 'width', img );
  				}
  			}
  		} else {
  			const srcset = data.attributeNewValue;
  
  			if ( srcset.data ) {
  				writer.setAttribute( 'srcset', srcset.data, img );
  				// Always outputting `100vw`. See https://github.com/ckeditor/ckeditor5-image/issues/2.
  				writer.setAttribute( 'sizes', '100vw', img );
  
  				if ( srcset.width ) {
  					writer.setAttribute( 'width', srcset.width, img );
  				}
  			}
  		}
  	}
  }
  
  export function modelToViewAttributeConverter( attributeKey ) {
  	return dispatcher => {
  		dispatcher.on( `attribute:${ attributeKey }:image`, converter );
  	};
  
  	function converter( evt, data, conversionApi ) {
  		if ( !conversionApi.consumable.consume( data.item, evt.name ) ) {
  			return;
  		}
  
  		const viewWriter = conversionApi.writer;
  		const figure = conversionApi.mapper.toViewElement( data.item );
  		const img = getViewImgFromWidget( figure );
  
  		if ( data.attributeNewValue !== null ) {
  			viewWriter.setAttribute( data.attributeKey, data.attributeNewValue, img );
  		} else {
  			viewWriter.removeAttribute( data.attributeKey, img );
  		}
  	}
  }
  