jupyterlab-emrys
Version:
A computational environment for Jupyter. Powered by Emrys
352 lines (351 loc) • 9.78 kB
JavaScript
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var docregistry_1 = require('../docregistry');
var widget_1 = require('./widget');
var plugin_1 = require('../mainmenu/plugin');
var widgettracker_1 = require('../widgettracker');
var phosphor_menus_1 = require('phosphor-menus');
require('codemirror/theme/material.css');
require('codemirror/theme/zenburn.css');
require('codemirror/theme/abcdef.css');
require('codemirror/theme/base16-light.css');
require('codemirror/theme/base16-dark.css');
require('codemirror/theme/dracula.css');
require('codemirror/theme/hopscotch.css');
require('codemirror/theme/mbo.css');
require('codemirror/theme/mdn-like.css');
require('codemirror/theme/seti.css');
require('codemirror/theme/the-matrix.css');
require('codemirror/theme/xq-light.css');
require('codemirror/addon/edit/matchbrackets.js');
require('codemirror/addon/edit/closebrackets.js');
require('codemirror/addon/comment/comment.js');
require('codemirror/keymap/vim.js');
var EditorTracker = (function (_super) {
__extends(EditorTracker, _super);
function EditorTracker() {
_super.apply(this, arguments);
}
return EditorTracker;
}(widgettracker_1.WidgetTracker));
exports.EditorTracker = EditorTracker;
exports.tracker = new EditorTracker();
var currentApp;
var activeEditor;
exports.tracker.activeWidgetChanged.connect(function (sender, widget) {
activeEditor = widget;
});
/**
* The class name for all main area portrait tab icons.
*/
var PORTRAIT_ICON_CLASS = 'jp-MainAreaPortraitIcon';
/**
* The class name for the text editor icon from the default theme.
*/
var TEXTEDITOR_ICON_CLASS = 'jp-ImageTextEditor';
/**
* The editor handler extension.
*/
exports.editorHandlerExtension = {
id: 'jupyter.extensions.editorHandler',
requires: [docregistry_1.DocumentRegistry, plugin_1.MainMenu],
activate: activateEditorHandler
};
/**
* Sets up the editor widget
*/
function activateEditorHandler(app, registry, mainMenu) {
var saveFile = 'editor:save-file';
var lineNumbers = 'editor:line-numbers';
var lineWrap = 'editor:line-wrap';
var matchBrackets = 'editor:match-brackets';
var vimMode = 'editor:vim-mode';
var defaultMode = 'editor:default-mode';
var closeAll = 'editor:close-all';
var editorMenu = new phosphor_menus_1.MenuItem({
text: 'Editor',
submenu: menu
});
currentApp = app;
mainMenu.addItem(editorMenu, { rank: 30 });
registry.addWidgetFactory(new widget_1.EditorWidgetFactory(), {
fileExtensions: ['*'],
displayName: 'Editor',
modelName: 'text',
defaultFor: ['*'],
preferKernel: false,
canStartKernel: false
});
app.commands.add([
{
id: saveFile,
handler: saveDoc
},
{
id: lineNumbers,
handler: toggleLineNums
},
{
id: lineWrap,
handler: toggleLineWrap
},
{
id: matchBrackets,
handler: toggleMatchBrackets
},
{
id: defaultMode,
handler: toggleDefault
},
{
id: vimMode,
handler: toggleVim
},
{
id: closeAll,
handler: closeAllFiles
}
]);
app.palette.add([
{
command: saveFile,
category: 'Editor',
text: 'Save File',
caption: 'Save the currently open text file'
},
{
command: lineNumbers,
category: 'Editor',
text: 'Toggle Line Numbers',
caption: 'Toggles the line numbers on the editor'
},
{
command: lineWrap,
category: 'Editor',
text: 'Toggle Line Wrap',
caption: 'Toggles line wrapping on the editor'
},
{
command: matchBrackets,
category: 'Editor',
text: 'Toggle Match Brackets',
caption: 'Toggles bracket matching on the editor'
},
{
command: defaultMode,
category: 'Editor',
text: 'Vim Mode Off',
caption: 'Turns off vim mode (default)'
},
{
command: vimMode,
category: 'Editor',
text: 'Vim Mode',
caption: 'Turns on vim mode'
},
{
command: closeAll,
category: 'Editor',
text: 'Close all files',
caption: 'Closes all currently open text files'
}
]);
}
var liNums = true;
var liWrap = false;
var matchBracks = false;
/**
* Saves the current document
*/
function saveDoc() {
currentApp.commands.execute('file-operations:save');
}
/**
* Creates a new text file
*/
function newFile() {
currentApp.commands.execute('file-operations:new-text-file');
}
/**
* Toggle editor line numbers
*/
function toggleLineNums() {
if (!exports.tracker.isDisposed) {
var editor = exports.tracker.activeWidget.editor;
editor.setOption('lineNumbers', !editor.getOption('lineNumbers'));
}
}
/**
* Toggle editor line wrap
*/
function toggleLineWrap() {
if (!exports.tracker.isDisposed) {
var editor = exports.tracker.activeWidget.editor;
editor.setOption('lineWrapping', !editor.getOption('lineWrapping'));
}
}
/**
* Toggle editor matching brackets
*/
function toggleMatchBrackets() {
if (!exports.tracker.isDisposed) {
var editor = exports.tracker.activeWidget.editor;
editor.setOption('matchBrackets', !editor.getOption('matchBrackets'));
}
}
/**
* Turns on the editor's vim mode
*/
function toggleVim() {
var editors = exports.tracker.widgets;
for (var i = 0; i < editors.length; i++) {
editors[i].editor.setOption('keyMap', 'vim');
}
}
/**
* Sets the editor to default editing mode
*/
function toggleDefault() {
if (!exports.tracker.isDisposed) {
var editors = exports.tracker.widgets;
for (var i = 0; i < editors.length; i++) {
editors[i].editor.setOption('keyMap', 'default');
}
}
}
/**
* Close all currently open text editor files
*/
function closeAllFiles() {
if (!exports.tracker.isDisposed) {
var editors = exports.tracker.widgets;
for (var i = 0; i < editors.length; i++) {
editors[i].close();
}
}
}
/**
* Handlers and menu items for the editor widget menu bar item
*/
var themeHandler = function (item) {
var editors = exports.tracker.widgets;
for (var i = 0; i < editors.length; i++) {
editors[i].editor.setOption('theme', item.text);
}
};
var settings = new phosphor_menus_1.Menu([
new phosphor_menus_1.MenuItem({
text: 'Toggle Line Numbers',
handler: toggleLineNums
}),
new phosphor_menus_1.MenuItem({
text: 'Toggle Line Wrapping',
handler: toggleLineWrap
}),
new phosphor_menus_1.MenuItem({
text: 'Toggle Match Brackets',
handler: toggleMatchBrackets
}),
new phosphor_menus_1.MenuItem({
text: 'Default Mode (all)',
handler: toggleDefault,
shortcut: 'Ctrl+D'
}),
new phosphor_menus_1.MenuItem({
text: 'Vim Mode (all)',
handler: toggleVim
}),
]);
var themes = new phosphor_menus_1.Menu([
new phosphor_menus_1.MenuItem({
text: 'default',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'abcdef',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'base16-dark',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'base16-light',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'hopscotch',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'material',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'mbo',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'mdn-like',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'seti',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'the-matrix',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'xq-light',
handler: themeHandler
}),
new phosphor_menus_1.MenuItem({
text: 'zenburn',
handler: themeHandler
})
]);
var menu = new phosphor_menus_1.Menu([
new phosphor_menus_1.MenuItem({
text: 'New text file',
handler: newFile,
shortcut: 'Ctrl-O'
}),
new phosphor_menus_1.MenuItem({
text: 'Save',
handler: saveDoc,
shortcut: 'Cmd-S'
}),
new phosphor_menus_1.MenuItem({
text: 'Close all editors',
handler: closeAllFiles
}),
new phosphor_menus_1.MenuItem({
type: phosphor_menus_1.MenuItem.Separator
}),
new phosphor_menus_1.MenuItem({
text: 'Settings',
submenu: settings
}),
new phosphor_menus_1.MenuItem({
text: 'Editor themes',
submenu: themes
})
]);
/**
* The editor widget tracker provider
*/
exports.editorTrackerProvider = {
id: 'jupyter.plugins.editorTracker',
provides: EditorTracker,
resolve: function () {
return exports.tracker;
}
};