ckeditor5-image-upload-base64
Version:
The development environment of CKEditor 5 – the best browser-based rich text editor.
140 lines (121 loc) • 4.18 kB
JavaScript
/**
* @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 font/fontsize/fontsizeediting
*/
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
import FontSizeCommand from './fontsizecommand';
import { normalizeOptions } from './utils';
import { buildDefinition, FONT_SIZE } from '../utils';
import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
/**
* The font size editing feature.
*
* It introduces the {@link module:font/fontsize/fontsizecommand~FontSizeCommand command} and the `fontSize`
* attribute in the {@link module:engine/model/model~Model model} which renders in the {@link module:engine/view/view view}
* as a `<span>` element with either:
* * a style attribute (`<span style="font-size:12px">...</span>`),
* * or a class attribute (`<span class="text-small">...</span>`)
*
* depending on the {@link module:font/fontsize~FontSizeConfig configuration}.
*
* @extends module:core/plugin~Plugin
*/
export default class FontSizeEditing extends Plugin {
/**
* @inheritDoc
*/
static get pluginName() {
return 'FontSizeEditing';
}
/**
* @inheritDoc
*/
constructor( editor ) {
super( editor );
// Define default configuration using named presets.
editor.config.define( FONT_SIZE, {
options: [
'tiny',
'small',
'default',
'big',
'huge'
],
supportAllValues: false
} );
}
/**
* @inheritDoc
*/
init() {
const editor = this.editor;
// Allow fontSize attribute on text nodes.
editor.model.schema.extend( '$text', { allowAttributes: FONT_SIZE } );
editor.model.schema.setAttributeProperties( FONT_SIZE, {
isFormatting: true,
copyOnEnter: true
} );
const supportAllValues = editor.config.get( 'fontSize.supportAllValues' );
// Define view to model conversion.
const options = normalizeOptions( this.editor.config.get( 'fontSize.options' ) )
.filter( item => item.model );
const definition = buildDefinition( FONT_SIZE, options );
// Set-up the two-way conversion.
if ( supportAllValues ) {
this._prepareAnyValueConverters( definition );
} else {
editor.conversion.attributeToElement( definition );
}
// Add FontSize command.
editor.commands.add( FONT_SIZE, new FontSizeCommand( editor ) );
}
/**
* These converters enable keeping any value found as `style="font-size: *"` as a value of an attribute on a text even
* if it is not defined in the plugin configuration.
*
* @param {Object} definition {@link module:engine/conversion/conversion~ConverterDefinition Converter definition} out of input data.
* @private
*/
_prepareAnyValueConverters( definition ) {
const editor = this.editor;
// If `fontSize.supportAllValues=true`, we do not allow to use named presets in the plugin's configuration.
const presets = definition.model.values.filter( value => !String( value ).match( /[\d.]+[\w%]+/ ) );
if ( presets.length ) {
/**
* If {@link module:font/fontsize~FontSizeConfig#supportAllValues `config.fontSize.supportAllValues`} is `true`,
* you need to use numerical values as font size options.
*
* See valid examples described in the {@link module:font/fontsize~FontSizeConfig#options plugin configuration}.
*
* @error font-size-invalid-use-of-named-presets
* @param {Array.<String>} presets Invalid values.
*/
throw new CKEditorError(
'font-size-invalid-use-of-named-presets: ' +
'If config.fontSize.supportAllValues is set to true, you need to use numerical values as font size options.',
null, { presets }
);
}
editor.conversion.for( 'downcast' ).attributeToElement( {
model: FONT_SIZE,
view: ( attributeValue, { writer } ) => {
if ( !attributeValue ) {
return;
}
return writer.createAttributeElement( 'span', { style: 'font-size:' + attributeValue }, { priority: 7 } );
}
} );
editor.conversion.for( 'upcast' ).attributeToAttribute( {
model: {
key: FONT_SIZE,
value: viewElement => viewElement.getStyle( 'font-size' )
},
view: {
name: 'span'
}
} );
}
}