diff --git a/extensions/emmet/npm-shrinkwrap.json b/extensions/emmet/npm-shrinkwrap.json index 17c7ae2718b..eaf2e9b641c 100644 --- a/extensions/emmet/npm-shrinkwrap.json +++ b/extensions/emmet/npm-shrinkwrap.json @@ -67,6 +67,11 @@ "from": "@emmetio/markup-formatters@>=0.3.3 <0.4.0", "resolved": "https://registry.npmjs.org/@emmetio/markup-formatters/-/markup-formatters-0.3.3.tgz" }, + "@emmetio/math-expression": { + "version": "0.1.1", + "from": "@emmetio/math-expression@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/math-expression/-/math-expression-0.1.1.tgz" + }, "@emmetio/node": { "version": "0.1.2", "from": "@emmetio/node@>=0.1.2 <0.2.0", diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index f6a6a2f462b..1ae8a6d0ea8 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -74,6 +74,7 @@ "@emmetio/extract-abbreviation": "^0.1.1", "@emmetio/html-matcher": "^0.3.1", "@emmetio/css-parser": "^0.3.0", + "@emmetio/math-expression": "^0.1.1", "vscode-emmet-helper":"0.0.6" } } \ No newline at end of file diff --git a/extensions/emmet/src/bufferStream.ts b/extensions/emmet/src/bufferStream.ts index 923c7d04d0d..261b844c608 100644 --- a/extensions/emmet/src/bufferStream.ts +++ b/extensions/emmet/src/bufferStream.ts @@ -15,7 +15,7 @@ export class DocumentStreamReader { private document: TextDocument; private start: Position; private _eof: Position; - private pos: Position; + public pos: Position; private _eol: string; /** diff --git a/extensions/emmet/src/evaluateMathExpression.ts b/extensions/emmet/src/evaluateMathExpression.ts new file mode 100644 index 00000000000..b01b6327965 --- /dev/null +++ b/extensions/emmet/src/evaluateMathExpression.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * 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 evaluate from '@emmetio/math-expression'; +import { DocumentStreamReader } from './bufferStream'; + +export function evaluateMathExpression() { + let editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showInformationMessage('No editor is active'); + return; + } + const stream = new DocumentStreamReader(editor.document); + editor.edit(editBuilder => { + editor.selections.forEach(selection => { + const pos = selection.isReversed ? selection.anchor : selection.active; + stream.pos = pos; + + try { + const result = String(evaluate(stream, true)); + editBuilder.replace(new vscode.Range(stream.pos, pos), result); + } catch (err) { + // Ignore error since most likely it’s because of non-math expression + console.warn('Math evaluation error', err); + } + }); + }); + +} diff --git a/extensions/emmet/src/extension.ts b/extensions/emmet/src/extension.ts index fdd0507cbb3..7598f3ccd28 100644 --- a/extensions/emmet/src/extension.ts +++ b/extensions/emmet/src/extension.ts @@ -15,6 +15,7 @@ import { mergeLines } from './mergeLines'; import { toggleComment } from './toggleComment'; import { fetchEditPoint } from './editPoint'; import { fetchSelectItem } from './selectItem'; +import { evaluateMathExpression } from './evaluateMathExpression'; import { LANGUAGE_MODES, getMappedModes } from './util'; import { updateExtensionsPath } from 'vscode-emmet-helper'; @@ -91,6 +92,10 @@ export function activate(context: vscode.ExtensionContext) { fetchSelectItem('prev'); })); + context.subscriptions.push(vscode.commands.registerCommand('emmet.evaluateMathExpression', () => { + evaluateMathExpression(); + })); + updateExtensionsPath(); context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(() => { updateExtensionsPath(); diff --git a/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts b/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts index d136af8f1fa..f048e7c36ed 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts @@ -250,7 +250,8 @@ export abstract class EmmetEditorAction extends EditorAction { 'editor.emmet.action.selectPreviousItem': 'emmet.selectPrevItem', 'editor.emmet.action.selectNextItem': 'emmet.selectNextItem', 'editor.emmet.action.splitJoinTag': 'emmet.splitJoinTag', - 'editor.emmet.action.toggleComment': 'emmet.toggleComment' + 'editor.emmet.action.toggleComment': 'emmet.toggleComment', + 'editor.emmet.action.evaluateMath': 'emmet.evaluateMathExpression' }; protected emmetActionName: string;