فهرست منبع

Merge remote-tracking branch 'upstream/master' into execution

Jason Grout 9 سال پیش
والد
کامیت
0bdc3f875f
8فایلهای تغییر یافته به همراه142 افزوده شده و 73 حذف شده
  1. 1 2
      examples/lab/index.html
  2. 1 0
      examples/lab/index.js
  3. 3 2
      package.json
  4. 1 1
      scripts/travis_script.sh
  5. 67 25
      src/fileopener/plugin.ts
  6. 20 15
      src/imagehandler/plugin.ts
  7. 5 2
      src/notebook/plugin.ts
  8. 44 26
      src/terminal/plugin.ts

+ 1 - 2
examples/lab/index.html

@@ -3,8 +3,7 @@
 <head>
   <title>Jupyter Plugins Demo</title>
   <link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
-  <link rel="stylesheet" type="text/css" href="index.css">
-      <script id='jupyter-config-data' type="application/json">{ "baseUrl": "{{base_url}}", "wsUrl": "{{ws_url}}" }</script>
+  <script id='jupyter-config-data' type="application/json">{ "baseUrl": "{{base_url}}", "wsUrl": "{{ws_url}}" }</script>
   <script src="build/bundle.js" main="index"></script>
 </head>
 <body>

+ 1 - 0
examples/lab/index.js

@@ -11,6 +11,7 @@ function main() {
     require('phosphide/lib/appshell/plugin'),
     require('phosphide/lib/commandregistry/plugin'),
     require('phosphide/lib/commandpalette/plugin'),
+    require('phosphide/lib/shortcutmanager/plugin'),
     require('../lib/terminal/plugin'),
     require('../lib/fileopener/plugin'),
     require('../lib/filehandler/plugin'),

+ 3 - 2
package.json

@@ -7,14 +7,15 @@
   "dependencies": {
     "codemirror": "^5.10.0",
     "jupyter-js-cells": "^0.2.5",
-    "jupyter-js-filebrowser": "^0.4.7",
+    "jupyter-js-filebrowser": "^0.4.9",
     "jupyter-js-notebook": "^0.3.7",
     "jupyter-js-services": "^0.4.1",
     "jupyter-js-terminal": "^0.1.12",
     "jupyter-js-utils": "^0.2.7",
     "jupyter-js-widgets": "^0.0.2",
-    "phosphide": "^0.2.0",
+    "phosphide": "^0.3.0",
     "phosphor-codemirror": "^0.0.1",
+    "phosphor-command": "^0.6.0",
     "phosphor-di": "^0.9.0",
     "phosphor-properties": "^2.0.0",
     "phosphor-tabs": "^1.0.0-rc.2"

+ 1 - 1
scripts/travis_script.sh

@@ -1,7 +1,7 @@
 #!/bin/bash
 set -e
 export DISPLAY=:99.0
-sh -e /etc/init.d/xvfb start
+sh -e /etc/init.d/xvfb start || true
 
 npm run clean
 npm run build

+ 67 - 25
src/fileopener/plugin.ts

@@ -7,9 +7,13 @@ import {
 } from 'jupyter-js-filebrowser';
 
 import {
-  IAppShell, ICommandPalette, ICommandRegistry
+  IAppShell, ICommandPalette, ICommandRegistry, IShortcutManager
 } from 'phosphide';
 
+import {
+  SimpleCommand
+} from 'phosphor-command';
+
 import {
   Container, Token
 } from 'phosphor-di';
@@ -41,33 +45,71 @@ import {
 export
 function resolve(container: Container): Promise<void> {
   return container.resolve({
-    requires: [IAppShell, IFileOpener, IFileBrowserWidget, ICommandPalette, ICommandRegistry],
-    create: (appShell: IAppShell, opener: IFileOpener, browser: IFileBrowserWidget, palette: ICommandPalette, registry: ICommandRegistry): void => {
-      registry.add('jupyter-plugins:new:text-file', () => {
-        browser.newUntitled('file', '.txt').then(
-          contents => opener.open(contents.path)
-        );
+    requires: [IAppShell, IFileOpener, IFileBrowserWidget, ICommandPalette, ICommandRegistry, IShortcutManager],
+    create: (appShell: IAppShell, opener: IFileOpener, browser: IFileBrowserWidget, palette: ICommandPalette, registry: ICommandRegistry, shortcuts: IShortcutManager): void => {
+
+      // Create a command to add a new empty text file.
+      // This requires an id and an instance of a command object.
+      let newTextFileId = 'file-operations:new-text-file';
+      let newTextFileCommand = new SimpleCommand({
+        handler: () => {
+          browser.newUntitled('file', '.txt').then(
+            contents => opener.open(contents.path)
+          );
+        }
       });
 
-      registry.add('jupyter-plugins:new:notebook', () => {
-        browser.newUntitled('notebook').then(
-          contents => opener.open(contents.path)
-        );
+      // Add the command to the command registry, shortcut manager
+      // and command palette plugins.
+      registry.add([
+        {
+          id: newTextFileId,
+          command: newTextFileCommand
+        }
+      ]);
+      shortcuts.add([
+        {
+          sequence: ['Ctrl O'],
+          selector: '*',
+          command: newTextFileId
+        }
+      ]);
+      palette.add([
+        {
+          id: newTextFileId,
+          args: void 0
+        }
+      ]);
+
+      // Add the command for a new notebook.
+      let newNotebookId = 'file-operations:new-notebook';
+      let newNotebookCommand = new SimpleCommand({
+        handler: () => {
+          browser.newUntitled('notebook').then(
+            contents => opener.open(contents.path)
+          );
+        }
       });
-      let paletteItems = [{
-        id: 'jupyter-plugins:new:text-file',
-        title: 'Text File',
-        caption: ''
-      }, {
-        id: 'jupyter-plugins:new:notebook',
-        title: 'Notebook',
-        caption: ''
-      }];
-      let section = {
-        text: 'New...',
-        items: paletteItems
-      }
-      palette.add([section]);
+
+      registry.add([
+        {
+          id: newNotebookId,
+          command: newNotebookCommand
+        }
+      ]);
+      shortcuts.add([
+        {
+          sequence: ['Ctrl Shift N'],
+          selector: '*',
+          command: newNotebookId
+        }
+      ]);
+      palette.add([
+        {
+          id: newNotebookId,
+          args: void 0
+        }
+      ]);
 
       browser.widgetFactory = path => {
         return opener.open(path);

+ 20 - 15
src/imagehandler/plugin.ts

@@ -67,8 +67,8 @@ class ImageHandler extends AbstractFileHandler {
   protected createWidget(path: string): Widget {
     let ext = path.split('.').pop();
     var widget = new Widget();
-    let canvas = document.createElement('canvas');
-    widget.node.appendChild(canvas);
+    let image = document.createElement('img');
+    widget.node.appendChild(image);
     widget.node.style.overflowX = 'auto';
     widget.node.style.overflowY = 'auto';
     widget.title.text = path.split('/').pop();
@@ -76,20 +76,25 @@ class ImageHandler extends AbstractFileHandler {
   }
 
  /**
-   * Populate a widget from `IContentsModel`.
-   */
-  protected populateWidget(widget: Widget, model: IContentsModel): Promise<void> {
-    let ext = model.path.split('.').pop();
-    let uri = `data:${model.mimetype};${model.format},${model.content}`;
-    var img = new Image();
-    var canvas = widget.node.firstChild as HTMLCanvasElement;
-    img.addEventListener('load', () => {
-      canvas.width = img.naturalWidth;
-      canvas.height = img.naturalHeight;
-      let context = canvas.getContext('2d')
-      context.drawImage(img, 0, 0);
+  * Populate a widget from `IContentsModel`.
+  */
+  protected setState(widget: Widget, model: IContentsModel): Promise<void> {
+    return new Promise<void>((resolve, reject) => {
+      let img = widget.node.firstChild as HTMLImageElement;
+      img.addEventListener('load', () => {
+        resolve(void 0);
+      });
+      img.addEventListener('error', error => {
+        reject(error);
+      });
+      img.src = `data:${model.mimetype};${model.format},${model.content}`;;
     });
-    img.src = uri;
+  }
+
+  /**
+   * Get the state of the Widget, returns `undefined`.
+   */
+  protected getState(widget: Widget): Promise<IContentsModel> {
     return Promise.resolve(void 0);
   }
 }

+ 5 - 2
src/notebook/plugin.ts

@@ -184,17 +184,20 @@ class NotebookFileHandler extends AbstractFileHandler {
     return panel;
   }
 
-
   /**
    * Populate the notebook widget with the contents of the notebook.
    */
-  protected populateWidget(widget: Widget, model: IContentsModel): Promise<void> {
+  protected setState(widget: Widget, model: IContentsModel): Promise<void> {
     let nbData: NBData = makedata(model);
     let nbWidget: NotebookWidget = ((widget as Panel).childAt(2)) as NotebookWidget;
     populateNotebookModel(nbWidget.model, nbData);
     return Promise.resolve();
   }
 
+  protected getState(widget: Widget): Promise<IContentsModel> {
+    return Promise.resolve(void 0);
+  }
+
   session: INotebookSessionManager;
 }
 

+ 44 - 26
src/terminal/plugin.ts

@@ -7,9 +7,13 @@ import {
 } from 'jupyter-js-terminal';
 
 import {
-  IAppShell, ICommandPalette, ICommandRegistry
+  IAppShell, ICommandPalette, ICommandRegistry, IShortcutManager
 } from 'phosphide';
 
+import {
+  SimpleCommand
+} from 'phosphor-command';
+
 import {
   Container, Token
 } from 'phosphor-di';
@@ -24,33 +28,47 @@ import './plugin.css';
 export
 function resolve(container: Container): Promise<void> {
   return container.resolve({
-    requires: [IAppShell, ICommandPalette, ICommandRegistry],
-    create: (shell: IAppShell, palette: ICommandPalette, registry: ICommandRegistry) => {
-      registry.add('jupyter-plugins:new:terminal', () => {
-        let term = new TerminalWidget();
-        term.color = 'black';
-        term.background = 'white';
-        term.title.closable = true;
-        shell.addToMainArea(term);
-        let stack = term.parent;
-        if (!stack) {
-          return;
-        }
-        let tabs = stack.parent;
-        if (tabs instanceof TabPanel) {
-          tabs.currentWidget = term;
+    requires: [IAppShell, ICommandPalette, ICommandRegistry, IShortcutManager],
+    create: (shell: IAppShell, palette: ICommandPalette, registry: ICommandRegistry, shortcuts: IShortcutManager) => {
+
+      let newTerminalId = 'terminal:new';
+      let newTerminalCommand = new SimpleCommand({
+        handler: () => {
+          let term = new TerminalWidget();
+          term.color = 'black';
+          term.background = 'white';
+          term.title.closable = true;
+          shell.addToMainArea(term);
+          let stack = term.parent;
+          if (!stack) {
+            return;
+          }
+          let tabs = stack.parent;
+          if (tabs instanceof TabPanel) {
+            tabs.currentWidget = term;
+          }
         }
       });
-      let paletteItem = {
-        id: 'jupyter-plugins:new:terminal',
-        title: 'Terminal',
-        caption: ''
-      };
-      let section = {
-        text: 'New...',
-        items: [paletteItem]
-      }
-      palette.add([section]);
+
+      registry.add([
+        {
+          id: newTerminalId,
+          command: newTerminalCommand
+        }
+      ]);
+      shortcuts.add([
+        {
+          sequence: ['Ctrl T'],
+          selector: '*',
+          command: newTerminalId
+        }
+      ]);
+      palette.add([
+        {
+          id: newTerminalId,
+          args: void 0
+        }
+      ]);
     }
   });
 }