mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-28 12:33:35 +01:00
Explicit mapping for langs whose parent are emmet supported #28545
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -15,23 +15,9 @@ import { mergeLines } from './mergeLines';
|
||||
import { toggleComment } from './toggleComment';
|
||||
import { fetchEditPoint } from './editPoint';
|
||||
import { fetchSelectItem } from './selectItem';
|
||||
import { updateExtensionsPath } from './util';
|
||||
import { updateExtensionsPath, LANGUAGE_MODES, getMappedModes } from './util';
|
||||
|
||||
|
||||
const LANGUAGE_MODES: Object = {
|
||||
'html': ['!', '.', '}'],
|
||||
'jade': ['!', '.', '}'],
|
||||
'slim': ['!', '.', '}'],
|
||||
'haml': ['!', '.', '}'],
|
||||
'xml': ['.', '}'],
|
||||
'xsl': ['.', '}'],
|
||||
'javascriptreact': ['.'],
|
||||
'typescriptreact': ['.'],
|
||||
'css': [':'],
|
||||
'scss': [':'],
|
||||
'sass': [':'],
|
||||
'less': [':'],
|
||||
'stylus': [':']
|
||||
};
|
||||
|
||||
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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user