From a49a42680a4269b79c4e80f6d754bbded03a0593 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 20 Jun 2017 18:47:31 -0700 Subject: [PATCH] Explicit mapping for langs whose parent are emmet supported #28545 --- extensions/emmet/src/abbreviationActions.ts | 15 +++------ extensions/emmet/src/extension.ts | 36 ++++++--------------- extensions/emmet/src/util.ts | 33 +++++++++++++++++++ 3 files changed, 47 insertions(+), 37 deletions(-) diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index aeb64582f2515..b4d996f2d7546 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -10,7 +10,7 @@ import parseStylesheet from '@emmetio/css-parser'; import parse from '@emmetio/html-matcher'; import Node from '@emmetio/node'; -import { getSyntax, getProfile, getVariables, isStyleSheet, getNode, getInnerRange } from './util'; +import { getSyntax, getProfile, getVariables, isStyleSheet, getNode, getInnerRange, getMappedModes } from './util'; import { DocumentStreamReader } from './bufferStream'; const field = (index, placeholder) => `\${${index}${placeholder ? ':' + placeholder : ''}}`; @@ -42,17 +42,12 @@ export function expandAbbreviation() { return; } let syntax = getSyntax(editor.document); - let mappedSyntax = false; - let emmetConfig = vscode.workspace.getConfiguration('emmet'); - if (emmetConfig && emmetConfig['syntaxProfiles']) { - let syntaxProfiles = emmetConfig['syntaxProfiles']; - if (typeof syntaxProfiles[syntax] === 'string') { - syntax = syntaxProfiles[syntax]; - mappedSyntax = true; - } - } + let mappedSyntax = getMappedModes()[syntax]; + if (!mappedSyntax) { syntax = syntaxHelper(syntax, editor.document, editor.selection.end); + } else { + syntax = mappedSyntax; } if (!syntax) { return; diff --git a/extensions/emmet/src/extension.ts b/extensions/emmet/src/extension.ts index eaaf869a602d9..48b4c3d61b37d 100644 --- a/extensions/emmet/src/extension.ts +++ b/extensions/emmet/src/extension.ts @@ -15,23 +15,9 @@ import { mergeLines } from './mergeLines'; import { toggleComment } from './toggleComment'; import { fetchEditPoint } from './editPoint'; import { fetchSelectItem } from './selectItem'; -import { updateExtensionsPath } from './util'; - -const LANGUAGE_MODES: Object = { - 'html': ['!', '.', '}'], - 'jade': ['!', '.', '}'], - 'slim': ['!', '.', '}'], - 'haml': ['!', '.', '}'], - 'xml': ['.', '}'], - 'xsl': ['.', '}'], - 'javascriptreact': ['.'], - 'typescriptreact': ['.'], - 'css': [':'], - 'scss': [':'], - 'sass': [':'], - 'less': [':'], - 'stylus': [':'] -}; +import { updateExtensionsPath, LANGUAGE_MODES, getMappedModes } from './util'; + + export function activate(context: vscode.ExtensionContext) { let completionProvider = new EmmetCompletionItemProvider(); @@ -41,16 +27,12 @@ export function activate(context: vscode.ExtensionContext) { }); let completionProviderForMappedSyntax = new EmmetCompletionItemProvider(true); - let emmetConfig = vscode.workspace.getConfiguration('emmet'); - if (emmetConfig && emmetConfig['syntaxProfiles']) { - let syntaxProfiles = emmetConfig['syntaxProfiles']; - Object.keys(syntaxProfiles).forEach(syntax => { - if (typeof syntaxProfiles[syntax] === 'string' && LANGUAGE_MODES[syntaxProfiles[syntax]]) { - const provider = vscode.languages.registerCompletionItemProvider(syntax, completionProviderForMappedSyntax, ...LANGUAGE_MODES[syntaxProfiles[syntax]]); - context.subscriptions.push(provider); - } - }); - } + let mappedModes = getMappedModes(); + Object.keys(mappedModes).forEach(syntax => { + const provider = vscode.languages.registerCompletionItemProvider(syntax, completionProviderForMappedSyntax, ...LANGUAGE_MODES[mappedModes[syntax]]); + context.subscriptions.push(provider); + }); + context.subscriptions.push(vscode.commands.registerCommand('emmet.wrapWithAbbreviation', () => { wrapWithAbbreviation(); diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 9dfc5e89d9141..a4d85b1b39541 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -13,6 +13,27 @@ import * as fs from 'fs'; let variablesFromFile = {}; let profilesFromFile = {}; let emmetExtensionsPath = ''; + +export const LANGUAGE_MODES: Object = { + 'html': ['!', '.', '}'], + 'jade': ['!', '.', '}'], + 'slim': ['!', '.', '}'], + 'haml': ['!', '.', '}'], + 'xml': ['.', '}'], + 'xsl': ['.', '}'], + 'javascriptreact': ['.'], + 'typescriptreact': ['.'], + 'css': [':'], + 'scss': [':'], + 'sass': [':'], + 'less': [':'], + 'stylus': [':'] +}; + +// Explicitly map languages to their parent language to get emmet support +export const MAPPED_MODES: Object = { + 'handlebars': 'html' +}; export function validate(allowStylesheet: boolean = true): boolean { let editor = vscode.window.activeTextEditor; if (!editor) { @@ -96,6 +117,18 @@ export function getVariables(): any { return Object.assign({}, variablesFromFile, variablesFromSettings); } +export function getMappedModes(): any { + let finalMappedModes = {}; + let syntaxProfileConfig = vscode.workspace.getConfiguration('emmet')['syntaxProfiles']; + let syntaxProfiles = Object.assign({}, MAPPED_MODES, syntaxProfileConfig ? syntaxProfileConfig : {}); + Object.keys(syntaxProfiles).forEach(syntax => { + if (typeof syntaxProfiles[syntax] === 'string' && LANGUAGE_MODES[syntaxProfiles[syntax]]) { + finalMappedModes[syntax] = syntaxProfiles[syntax]; + } + }); + return finalMappedModes; +} + export function updateExtensionsPath() { let currentEmmetExtensionsPath = vscode.workspace.getConfiguration('emmet')['extensionsPath']; if (emmetExtensionsPath !== currentEmmetExtensionsPath) {