/*--------------------------------------------------------------------------------------------- * 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 { getHtmlFlatNode, validate } from './util'; import { HtmlNode as HtmlFlatNode } from 'EmmetFlatNode'; import { getRootNode } from './parseDocument'; export function updateTag(tagName: string): Thenable | undefined { if (!validate(false) || !vscode.window.activeTextEditor) { return; } const editor = vscode.window.activeTextEditor; const document = editor.document; const rootNode = getRootNode(document, true); if (!rootNode) { return; } const rangesToUpdate = editor.selections.reverse() .reduce((prev, selection) => prev.concat(getRangesToUpdate(document, selection, rootNode)), []); return editor.edit(editBuilder => { rangesToUpdate.forEach(range => { editBuilder.replace(range, tagName); }); }); } function getRangesFromNode(node: HtmlFlatNode, document: vscode.TextDocument): vscode.Range[] { let ranges: vscode.Range[] = []; if (node.open) { const start = document.positionAt(node.open.start); ranges.push(new vscode.Range(start.translate(0, 1), start.translate(0, 1).translate(0, node.name.length))); } if (node.close) { const endTagStart = document.positionAt(node.close.start); const end = document.positionAt(node.close.end); ranges.push(new vscode.Range(endTagStart.translate(0, 2), end.translate(0, -1))); } return ranges; } function getRangesToUpdate(document: vscode.TextDocument, selection: vscode.Selection, rootNode: HtmlFlatNode): vscode.Range[] { const documentText = document.getText(); const offset = document.offsetAt(selection.start); const nodeToUpdate = getHtmlFlatNode(documentText, rootNode, offset, true); if (!nodeToUpdate) { return []; } return getRangesFromNode(nodeToUpdate, document); }