UNPKG

ckeditor5-image-upload-base64

Version:

The development environment of CKEditor 5 – the best browser-based rich text editor.

154 lines (136 loc) 4.88 kB
/** * @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/imagestyle/utils */ /* globals console */ import fullWidthIcon from '@ckeditor/ckeditor5-core/theme/icons/object-full-width.svg'; import leftIcon from '@ckeditor/ckeditor5-core/theme/icons/object-left.svg'; import centerIcon from '@ckeditor/ckeditor5-core/theme/icons/object-center.svg'; import rightIcon from '@ckeditor/ckeditor5-core/theme/icons/object-right.svg'; import { attachLinkToDocumentation } from '@ckeditor/ckeditor5-utils/src/ckeditorerror'; /** * Default image styles provided by the plugin that can be referred in the * {@link module:image/image~ImageConfig#styles} configuration. * * Among them, 2 default semantic content styles are available: * * * `full` is a full–width image without any CSS class, * * `side` is a side image styled with the `image-style-side` CSS class. * * There are also 3 styles focused on formatting: * * * `alignLeft` aligns the image to the left using the `image-style-align-left` class, * * `alignCenter` centers the image using the `image-style-align-center` class, * * `alignRight` aligns the image to the right using the `image-style-align-right` class, * * @member {Object.<String,Object>} */ const defaultStyles = { // This option is equal to the situation when no style is applied. full: { name: 'full', title: 'Full size image', icon: fullWidthIcon, isDefault: true }, // This represents a side image. side: { name: 'side', title: 'Side image', icon: rightIcon, className: 'image-style-side' }, // This style represents an image aligned to the left. alignLeft: { name: 'alignLeft', title: 'Left aligned image', icon: leftIcon, className: 'image-style-align-left' }, // This style represents a centered image. alignCenter: { name: 'alignCenter', title: 'Centered image', icon: centerIcon, className: 'image-style-align-center' }, // This style represents an image aligned to the right. alignRight: { name: 'alignRight', title: 'Right aligned image', icon: rightIcon, className: 'image-style-align-right' } }; /** * Default image style icons provided by the plugin that can be referred in the * {@link module:image/image~ImageConfig#styles} configuration. * * There are 4 icons available: `'full'`, `'left'`, `'center'` and `'right'`. * * @member {Object.<String, String>} */ const defaultIcons = { full: fullWidthIcon, left: leftIcon, right: rightIcon, center: centerIcon }; /** * Returns a {@link module:image/image~ImageConfig#styles} array with items normalized in the * {@link module:image/imagestyle/imagestyleediting~ImageStyleFormat} format and a complete `icon` markup for each style. * * @returns {Array.<module:image/imagestyle/imagestyleediting~ImageStyleFormat>} */ export function normalizeImageStyles( configuredStyles = [] ) { return configuredStyles.map( _normalizeStyle ); } // Normalizes an image style provided in the {@link module:image/image~ImageConfig#styles} // and returns it in a {@link module:image/imagestyle/imagestyleediting~ImageStyleFormat}. // // @param {Object} style // @returns {@link module:image/imagestyle/imagestyleediting~ImageStyleFormat} function _normalizeStyle( style ) { // Just the name of the style has been passed. if ( typeof style == 'string' ) { const styleName = style; // If it's one of the defaults, just use it. if ( defaultStyles[ styleName ] ) { // Clone the style to avoid overriding defaults. style = Object.assign( {}, defaultStyles[ styleName ] ); } // If it's just a name but none of the defaults, warn because probably it's a mistake. else { console.warn( attachLinkToDocumentation( 'image-style-not-found: There is no such image style of given name.' ), { name: styleName } ); // Normalize the style anyway to prevent errors. style = { name: styleName }; } } // If an object style has been passed and if the name matches one of the defaults, // extend it with defaults – the user wants to customize a default style. // Note: Don't override the user–defined style object, clone it instead. else if ( defaultStyles[ style.name ] ) { const defaultStyle = defaultStyles[ style.name ]; const extendedStyle = Object.assign( {}, style ); for ( const prop in defaultStyle ) { if ( !Object.prototype.hasOwnProperty.call( style, prop ) ) { extendedStyle[ prop ] = defaultStyle[ prop ]; } } style = extendedStyle; } // If an icon is defined as a string and correspond with a name // in default icons, use the default icon provided by the plugin. if ( typeof style.icon == 'string' && defaultIcons[ style.icon ] ) { style.icon = defaultIcons[ style.icon ]; } return style; }