UNPKG

jupyterlab-emrys

Version:

A computational environment for Jupyter. Powered by Emrys

352 lines (351 loc) 9.78 kB
// 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; } };