Skip to content

Commit

Permalink
Explicit mapping for langs whose parent are emmet supported #28545
Browse files Browse the repository at this point in the history
  • Loading branch information
ramya-rao-a committed Jun 21, 2017
1 parent 4b2fcb8 commit a49a426
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 37 deletions.
15 changes: 5 additions & 10 deletions extensions/emmet/src/abbreviationActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 : ''}}`;
Expand Down Expand Up @@ -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;
Expand Down
36 changes: 9 additions & 27 deletions extensions/emmet/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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();
Expand Down
33 changes: 33 additions & 0 deletions extensions/emmet/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit a49a426

Please sign in to comment.