ckeditor5-image-upload-base64
Version:
The development environment of CKEditor 5 – the best browser-based rich text editor.
99 lines (88 loc) • 2.38 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 code-block/indentcodeblockcommand
*/
import Command from '@ckeditor/ckeditor5-core/src/command';
import {
getIndentOutdentPositions,
isModelSelectionInCodeBlock
} from './utils';
/**
* The code block indentation increase command plugin.
*
* @extends module:core/command~Command
*/
export default class IndentCodeBlockCommand extends Command {
constructor( editor ) {
super( editor );
/**
* A sequence of characters added to the line when the command is executed.
*
* @readonly
* @private
* @member {String}
*/
this._indentSequence = editor.config.get( 'codeBlock.indentSequence' );
}
/**
* @inheritDoc
*/
refresh() {
this.isEnabled = this._checkEnabled();
}
/**
* Executes the command. When the command {@link #isEnabled is enabled}, the indentation of the
* code lines in the selection will be increased.
*
* @fires execute
*/
execute() {
const editor = this.editor;
const model = editor.model;
model.change( writer => {
const positions = getIndentOutdentPositions( model );
// Indent all positions, for instance assuming the indent sequence is 4x space (" "):
//
// <codeBlock>^foo</codeBlock> -> <codeBlock> foo</codeBlock>
//
// <codeBlock>foo^bar</codeBlock> -> <codeBlock>foo bar</codeBlock>
//
// Also, when there is more than one position:
//
// <codeBlock>
// ^foobar
// <softBreak></softBreak>
// ^bazqux
// </codeBlock>
//
// ->
//
// <codeBlock>
// foobar
// <softBreak></softBreak>
// bazqux
// </codeBlock>
//
for ( const position of positions ) {
writer.insertText( this._indentSequence, position );
}
} );
}
/**
* Checks whether the command can be enabled in the current context.
*
* @private
* @returns {Boolean} Whether the command should be enabled.
*/
_checkEnabled() {
if ( !this._indentSequence ) {
return false;
}
// Indent (forward) command is always enabled when there's any code block in the selection
// because you can always indent code lines.
return isModelSelectionInCodeBlock( this.editor.model.document.selection );
}
}