UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

105 lines 9.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IndentTextCommand = void 0; const rangeConversion_1 = require("../../utils/rangeConversion"); const retrieveArgument_1 = require("../commands/retrieveArgument"); const AdvancedTextEditCommand_1 = require("./AdvancedTextEditCommand"); /** A command to indent and dedent text */ class IndentTextCommand extends AdvancedTextEditCommand_1.AdvancedTextEditCommand { /** * A command to indent or dedent the selected text * @param textField The text field to indent or dedent the text of * @param indent The indentation amount, negative to dedent * @param indentCharacter The character to indent or dedent by * @param updateCaret Whether to change the text selection after indenting */ constructor(textField, indentArg, indentCharacterArg = " ".repeat(4), updateCaretArg = true) { super(textField, ({ text, selection }) => { const indent = retrieveArgument_1.retrieveArgument(indentArg); const indentCharacter = retrieveArgument_1.retrieveArgument(indentCharacterArg); const updateCaret = retrieveArgument_1.retrieveArgument(updateCaretArg); const lines = rangeConversion_1.getTextLines(text); // Get a 2d selection const startPoint = rangeConversion_1.get2dIndex(text, selection.start); const endPoint = rangeConversion_1.get2dIndex(text, selection.end); const startRow = Math.min(startPoint.row, endPoint.row); const endRow = Math.max(startPoint.row, endPoint.row); // Retrieve the changes to indent or dedent each line let lineStart = 0; const changes = lines.map((line, i) => { // If the line isn't in range, don't alter it if (i < startRow || i > endRow) { lineStart += line.length; return { change: undefined, newLine: line }; } const orLine = line; // Indent the line if specified let indentLine = indent; while (indentLine > 0) { indentLine--; line = indentCharacter + line; } // Dedent the line if specified while (indentLine < 0 && line.slice(0, indentCharacter.length) == indentCharacter) { indentLine++; line = line.slice(indentCharacter.length); } // Dedent remaining space or other characters if some are left if (indentLine < 0) { for (let length = indentCharacter.length; length > 0; length--) { if (line.slice(0, length) == indentCharacter.slice(0, length)) { line = line.slice(length); break; } } } // Move the caret if on this line const lineDelta = line.length - orLine.length; if (startPoint.row == i) startPoint.column = Math.max(0, startPoint.column + lineDelta); if (endPoint.row == i) endPoint.column = Math.max(0, endPoint.column + lineDelta); // Return the adjusted line const lineData = { change: lineDelta > 0 ? { start: lineStart, end: lineStart, content: line.substring(0, lineDelta), } : { start: lineStart, end: lineStart - lineDelta, content: "", }, newLine: line, }; lineStart += orLine.length; // Increase the lineStart index, for the next iteration return lineData; }); // Extract both the new text and the alterations from the change data const alterations = changes .map(({ change }) => change) .filter((change) => !!change); const newText = changes.map(({ newLine }) => newLine).join(""); // Calculate the new selection let newSelection; if (updateCaret) { const startIndex = rangeConversion_1.get1dIndex(newText, startPoint); const endIndex = rangeConversion_1.get1dIndex(newText, endPoint); newSelection = { start: startIndex, end: endIndex }; } return { text: alterations, selection: newSelection }; }, { addedText: typeof indentCharacterArg == "string" ? indentCharacterArg : undefined, }); this.metadata = { name: "Indent text", }; } } exports.IndentTextCommand = IndentTextCommand; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZW50VGV4dENvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGV4dEZpZWxkcy9pbnRlcmFjdGlvbi9hZHZhbmNlZC9JbmRlbnRUZXh0Q29tbWFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRUFBaUY7QUFHakYsbUVBQThEO0FBRzlELHVFQUFrRTtBQUVsRSwwQ0FBMEM7QUFDMUMsTUFBYSxpQkFBa0IsU0FBUSxpREFBdUI7SUFLMUQ7Ozs7OztPQU1HO0lBQ0gsWUFDSSxTQUFxQixFQUNyQixTQUF1QyxFQUN2QyxxQkFBbUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDaEUsaUJBQWdELElBQUk7UUFFcEQsS0FBSyxDQUNELFNBQVMsRUFDVCxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxNQUFNLEdBQUcsbUNBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsTUFBTSxlQUFlLEdBQUcsbUNBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxNQUFNLFdBQVcsR0FBRyxtQ0FBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVyRCxNQUFNLEtBQUssR0FBRyw4QkFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpDLHFCQUFxQjtZQUNyQixNQUFNLFVBQVUsR0FBRyw0QkFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsTUFBTSxRQUFRLEdBQUcsNEJBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FB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