eae5d8c807
These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as vscode from 'vscode';
|
|
import { Node } from 'EmmetFlatNode';
|
|
import { getFlatNode, offsetRangeToVsRange, validate } from './util';
|
|
import { getRootNode } from './parseDocument';
|
|
|
|
export function mergeLines() {
|
|
if (!validate(false) || !vscode.window.activeTextEditor) {
|
|
return;
|
|
}
|
|
|
|
const editor = vscode.window.activeTextEditor;
|
|
|
|
const rootNode = getRootNode(editor.document, true);
|
|
if (!rootNode) {
|
|
return;
|
|
}
|
|
|
|
return editor.edit(editBuilder => {
|
|
editor.selections.reverse().forEach(selection => {
|
|
const textEdit = getRangesToReplace(editor.document, selection, rootNode);
|
|
if (textEdit) {
|
|
editBuilder.replace(textEdit.range, textEdit.newText);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function getRangesToReplace(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Node): vscode.TextEdit | undefined {
|
|
let startNodeToUpdate: Node | undefined;
|
|
let endNodeToUpdate: Node | undefined;
|
|
|
|
const selectionStart = document.offsetAt(selection.start);
|
|
const selectionEnd = document.offsetAt(selection.end);
|
|
if (selection.isEmpty) {
|
|
startNodeToUpdate = endNodeToUpdate = getFlatNode(rootNode, selectionStart, true);
|
|
} else {
|
|
startNodeToUpdate = getFlatNode(rootNode, selectionStart, true);
|
|
endNodeToUpdate = getFlatNode(rootNode, selectionEnd, true);
|
|
}
|
|
|
|
if (!startNodeToUpdate || !endNodeToUpdate) {
|
|
return;
|
|
}
|
|
|
|
const startPos = document.positionAt(startNodeToUpdate.start);
|
|
const startLine = startPos.line;
|
|
const startChar = startPos.character;
|
|
const endPos = document.positionAt(endNodeToUpdate.end);
|
|
const endLine = endPos.line;
|
|
if (startLine === endLine) {
|
|
return;
|
|
}
|
|
|
|
const rangeToReplace = offsetRangeToVsRange(document, startNodeToUpdate.start, endNodeToUpdate.end);
|
|
let textToReplaceWith = document.lineAt(startLine).text.substr(startChar);
|
|
for (let i = startLine + 1; i <= endLine; i++) {
|
|
textToReplaceWith += document.lineAt(i).text.trim();
|
|
}
|
|
|
|
return new vscode.TextEdit(rangeToReplace, textToReplaceWith);
|
|
}
|