Path: blob/main/extensions/emmet/src/evaluateMathExpression.ts
4772 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45/* Based on @sergeche's work in his emmet plugin */67import * as vscode from 'vscode';8import evaluate, { extract } from '@emmetio/math-expression';910export function evaluateMathExpression(): Thenable<boolean> {11if (!vscode.window.activeTextEditor) {12vscode.window.showInformationMessage('No editor is active');13return Promise.resolve(false);14}15const editor = vscode.window.activeTextEditor;16return editor.edit(editBuilder => {17editor.selections.forEach(selection => {18// startpos always comes before endpos19const startpos = selection.isReversed ? selection.active : selection.anchor;20const endpos = selection.isReversed ? selection.anchor : selection.active;21const selectionText = editor.document.getText(new vscode.Range(startpos, endpos));2223try {24if (selectionText) {25// respect selections26const result = String(evaluate(selectionText));27editBuilder.replace(new vscode.Range(startpos, endpos), result);28} else {29// no selection made, extract expression from line30const lineToSelectionEnd = editor.document.getText(new vscode.Range(new vscode.Position(selection.end.line, 0), endpos));31const extractedIndices = extract(lineToSelectionEnd);32if (!extractedIndices) {33throw new Error('Invalid extracted indices');34}35const result = String(evaluate(lineToSelectionEnd.substr(extractedIndices[0], extractedIndices[1])));36const rangeToReplace = new vscode.Range(37new vscode.Position(selection.end.line, extractedIndices[0]),38new vscode.Position(selection.end.line, extractedIndices[1])39);40editBuilder.replace(rangeToReplace, result);41}42} catch (err) {43vscode.window.showErrorMessage('Could not evaluate expression');44// Ignore error since most likely it's because of non-math expression45console.warn('Math evaluation error', err);46}47});48});49}505152