Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/emmet/src/mergeLines.ts
4772 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as vscode from 'vscode';
7
import { Node } from 'EmmetFlatNode';
8
import { getFlatNode, offsetRangeToVsRange, validate } from './util';
9
import { getRootNode } from './parseDocument';
10
11
export function mergeLines() {
12
if (!validate(false) || !vscode.window.activeTextEditor) {
13
return;
14
}
15
16
const editor = vscode.window.activeTextEditor;
17
18
const rootNode = getRootNode(editor.document, true);
19
if (!rootNode) {
20
return;
21
}
22
23
return editor.edit(editBuilder => {
24
Array.from(editor.selections).reverse().forEach(selection => {
25
const textEdit = getRangesToReplace(editor.document, selection, rootNode);
26
if (textEdit) {
27
editBuilder.replace(textEdit.range, textEdit.newText);
28
}
29
});
30
});
31
}
32
33
function getRangesToReplace(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Node): vscode.TextEdit | undefined {
34
let startNodeToUpdate: Node | undefined;
35
let endNodeToUpdate: Node | undefined;
36
37
const selectionStart = document.offsetAt(selection.start);
38
const selectionEnd = document.offsetAt(selection.end);
39
if (selection.isEmpty) {
40
startNodeToUpdate = endNodeToUpdate = getFlatNode(rootNode, selectionStart, true);
41
} else {
42
startNodeToUpdate = getFlatNode(rootNode, selectionStart, true);
43
endNodeToUpdate = getFlatNode(rootNode, selectionEnd, true);
44
}
45
46
if (!startNodeToUpdate || !endNodeToUpdate) {
47
return;
48
}
49
50
const startPos = document.positionAt(startNodeToUpdate.start);
51
const startLine = startPos.line;
52
const startChar = startPos.character;
53
const endPos = document.positionAt(endNodeToUpdate.end);
54
const endLine = endPos.line;
55
if (startLine === endLine) {
56
return;
57
}
58
59
const rangeToReplace = offsetRangeToVsRange(document, startNodeToUpdate.start, endNodeToUpdate.end);
60
let textToReplaceWith = document.lineAt(startLine).text.substr(startChar);
61
for (let i = startLine + 1; i <= endLine; i++) {
62
textToReplaceWith += document.lineAt(i).text.trim();
63
}
64
65
return new vscode.TextEdit(rangeToReplace, textToReplaceWith);
66
}
67
68