monaco-editor
Version:
A browser based code editor
49 lines (46 loc) • 1.5 kB
JavaScript
import { languages } from '../../editor/editor.api.js';
const languageDefinitions = {};
const lazyLanguageLoaders = {};
class LazyLanguageLoader {
static getOrCreate(languageId) {
if (!lazyLanguageLoaders[languageId]) {
lazyLanguageLoaders[languageId] = new LazyLanguageLoader(languageId);
}
return lazyLanguageLoaders[languageId];
}
constructor(languageId) {
this._languageId = languageId;
this._loadingTriggered = false;
this._lazyLoadPromise = new Promise((resolve, reject) => {
this._lazyLoadPromiseResolve = resolve;
this._lazyLoadPromiseReject = reject;
});
}
load() {
if (!this._loadingTriggered) {
this._loadingTriggered = true;
languageDefinitions[this._languageId].loader().then(
(mod) => this._lazyLoadPromiseResolve(mod),
(err) => this._lazyLoadPromiseReject(err)
);
}
return this._lazyLoadPromise;
}
}
function registerLanguage(def) {
const languageId = def.id;
languageDefinitions[languageId] = def;
languages.register(def);
const lazyLanguageLoader = LazyLanguageLoader.getOrCreate(languageId);
languages.registerTokensProviderFactory(languageId, {
create: async () => {
const mod = await lazyLanguageLoader.load();
return mod.language;
}
});
languages.onLanguageEncountered(languageId, async () => {
const mod = await lazyLanguageLoader.load();
languages.setLanguageConfiguration(languageId, mod.conf);
});
}
export { registerLanguage };