jupyterlab-emrys
Version:
A computational environment for Jupyter. Powered by Emrys
72 lines (71 loc) • 2.3 kB
JavaScript
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
;
var CodeMirror = require('codemirror');
require('./codemirror-ipython');
require('./codemirror-ipythongfm');
// Bundle other common modes
require('codemirror/mode/javascript/javascript');
require('codemirror/mode/css/css');
require('codemirror/mode/julia/julia');
require('codemirror/mode/r/r');
require('codemirror/mode/markdown/markdown');
/**
* Load a codemirror mode by file name.
*/
function loadModeByFileName(editor, filename) {
loadInfo(editor, CodeMirror.findModeByFileName(filename));
}
exports.loadModeByFileName = loadModeByFileName;
/**
* Load a codemirror mode by mime type.
*/
function loadModeByMIME(editor, mimetype) {
loadInfo(editor, CodeMirror.findModeByMIME(mimetype));
}
exports.loadModeByMIME = loadModeByMIME;
/**
* Load a codemirror mode by mode name.
*/
function loadModeByName(editor, mode) {
loadInfo(editor, CodeMirror.findModeByName(mode));
}
exports.loadModeByName = loadModeByName;
/**
* Require a codemirror mode by name or Codemirror spec.
*/
function requireMode(mode) {
var modename = (typeof mode === 'string') ? mode :
mode.mode || mode.name;
var mimetype = (typeof mode !== 'string') ? mode.mime : '';
var ext = modename.split('.').pop();
// Get a modespec object by whatever means necessary.
var info = ((modename && mimetype && mode) ||
CodeMirror.findModeByName(modename) ||
CodeMirror.findModeByExtension(ext) ||
CodeMirror.findModeByMIME(modename) ||
{ mode: modename, mime: modename });
// Simplest, cheapest check by mode name.
if (CodeMirror.modes.hasOwnProperty(modename)) {
return Promise.resolve(info);
}
// Fetch the mode asynchronously.
return new Promise(function (resolve, reject) {
require([("codemirror/mode/" + info.mode + "/" + info.mode)], function () {
resolve(info);
});
});
}
exports.requireMode = requireMode;
/**
* Load a CodeMirror mode based on a mode spec.
*/
function loadInfo(editor, info) {
if (!info) {
editor.setOption('mode', 'null');
return;
}
requireMode(info).then(function () {
editor.setOption('mode', info.mime);
});
}