/**
* @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 (" "):
//
// ^foo -> foo
//
// foo^bar -> foo bar
//
// Also, when there is more than one position:
//
//
// ^foobar
//
// ^bazqux
//
//
// ->
//
//
// foobar
//
// bazqux
//
//
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 );
}
}