@launchmenu/core
Version:
An environment for visual keyboard controlled applets
105 lines • 9.8 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZW50VGV4dENvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGV4dEZpZWxkcy9pbnRlcmFjdGlvbi9hZHZhbmNlZC9JbmRlbnRUZXh0Q29tbWFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRUFBaUY7QUFHakYsbUVBQThEO0FBRzlELHVFQUFrRTtBQUVsRSwwQ0FBMEM7QUFDMUMsTUFBYSxpQkFBa0IsU0FBUSxpREFBdUI7SUFLMUQ7Ozs7OztPQU1HO0lBQ0gsWUFDSSxTQUFxQixFQUNyQixTQUF1QyxFQUN2QyxxQkFBbUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDaEUsaUJBQWdELElBQUk7UUFFcEQsS0FBSyxDQUNELFNBQVMsRUFDVCxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxNQUFNLEdBQUcsbUNBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsTUFBTSxlQUFlLEdBQUcsbUNBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxNQUFNLFdBQVcsR0FBRyxtQ0FBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVyRCxNQUFNLEtBQUssR0FBRyw4QkFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpDLHFCQUFxQjtZQUNyQixNQUFNLFVBQVUsR0FBRyw0QkFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsTUFBTSxRQUFRLEdBQUcsNEJBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0RCxxREFBcUQ7WUFDckQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLDZDQUE2QztnQkFDN0MsSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUU7b0JBQzVCLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUN6QixPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUM7aUJBQzdDO2dCQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQztnQkFFcEIsK0JBQStCO2dCQUMvQixJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUM7Z0JBQ3hCLE9BQU8sVUFBVSxHQUFHLENBQUMsRUFBRTtvQkFDbkIsVUFBVSxFQUFFLENBQUM7b0JBQ2IsSUFBSSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUM7aUJBQ2pDO2dCQUVELCtCQUErQjtnQkFDL0IsT0FDSSxVQUFVLEdBQUcsQ0FBQztvQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxFQUMxRDtvQkFDRSxVQUFVLEVBQUUsQ0FBQztvQkFDYixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQzdDO2dCQUVELDhEQUE4RDtnQkFDOUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO29CQUNoQixLQUFLLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTt3QkFDNUQsSUFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFDM0Q7NEJBQ0UsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzFCLE1BQU07eUJBQ1Q7cUJBQ0o7aUJBQ0o7Z0JBRUQsaUNBQWlDO2dCQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzlDLElBQUksVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUNuQixVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ25FLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUNqQixRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBRS9ELDJCQUEyQjtnQkFDM0IsTUFBTSxRQUFRLEdBQUc7b0JBQ2IsTUFBTSxFQUNGLFNBQVMsR0FBRyxDQUFDO3dCQUNULENBQUMsQ0FBQzs0QkFDSSxLQUFLLEVBQUUsU0FBUzs0QkFDaEIsR0FBRyxFQUFFLFNBQVM7NEJBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQzt5QkFDeEM7d0JBQ0gsQ0FBQyxDQUFDOzRCQUNJLEtBQUssRUFBRSxTQUFTOzRCQUNoQixHQUFHLEVBQUUsU0FBUyxHQUFHLFNBQVM7NEJBQzFCLE9BQU8sRUFBRSxFQUFFO3lCQUNkO29CQUNYLE9BQU8sRUFBRSxJQUFJO2lCQUNoQixDQUFDO2dCQUNGLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsdURBQXVEO2dCQUNuRixPQUFPLFFBQVEsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQztZQUVILHFFQUFxRTtZQUNyRSxNQUFNLFdBQVcsR0FBRyxPQUFPO2lCQUN0QixHQUFHLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7aUJBQ3pCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBNkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRTdELDhCQUE4QjtZQUM5QixJQUFJLFlBQXdDLENBQUM7WUFDN0MsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsTUFBTSxVQUFVLEdBQUcsNEJBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sUUFBUSxHQUFHLDRCQUFVLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxZQUFZLEdBQUcsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUMsQ0FBQzthQUNyRDtZQUVELE9BQU8sRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUMsQ0FBQztRQUN4RCxDQUFDLEVBQ0Q7WUFDSSxTQUFTLEVBQ0wsT0FBTyxrQkFBa0IsSUFBSSxRQUFRO2dCQUNqQyxDQUFDLENBQUMsa0JBQWtCO2dCQUNwQixDQUFDLENBQUMsU0FBUztTQUN0QixDQUNKLENBQUM7UUF2SEMsYUFBUSxHQUFHO1lBQ2QsSUFBSSxFQUFFLGFBQWE7U0FDdEIsQ0FBQztJQXNIRixDQUFDO0NBQ0o7QUExSEQsOENBMEhDIn0=
;