Kaynağa Gözat

Merge pull request #1469 from vidartf/expose-rendermime-renderer

Expose renderers on `RenderMime` + MIME bundle utils
Steven Silvester 8 yıl önce
ebeveyn
işleme
4780ea2b5f

+ 58 - 0
src/notebook/output-area/model.ts

@@ -25,6 +25,10 @@ import {
   IObservableVector, ObservableVector
 } from '../../common/observablevector';
 
+import {
+  RenderMime
+} from '../../rendermime';
+
 
 /**
  * An model that maintains a list of output data.
@@ -297,6 +301,60 @@ namespace OutputAreaModel {
    */
   export
   type Output = nbformat.IOutput | IInputRequest;
+
+  /**
+   * Get the mime bundle for an output.
+   *
+   * @params output - A kernel output message payload.
+   *
+   * @returns - A mime bundle for the payload.
+   */
+  export
+  function getBundle(output: nbformat.IOutput): nbformat.IMimeBundle {
+    let bundle: nbformat.IMimeBundle;
+    switch (output.output_type) {
+    case 'execute_result':
+      bundle = (output as nbformat.IExecuteResult).data;
+      break;
+    case 'display_data':
+      bundle = (output as nbformat.IDisplayData).data;
+      break;
+    case 'stream':
+      let text = (output as nbformat.IStream).text;
+      bundle = {
+        'application/vnd.jupyter.console-text': text
+      };
+      break;
+    case 'error':
+      let out: nbformat.IError = output as nbformat.IError;
+      let traceback = out.traceback.join('\n');
+      bundle = {
+        'application/vnd.jupyter.console-text': traceback ||
+          `${out.ename}: ${out.evalue}`
+      };
+      break;
+    default:
+      break;
+    }
+    return bundle || {};
+  }
+
+  /**
+   * Convert a mime bundle to a mime map.
+   */
+  export
+  function convertBundle(bundle: nbformat.IMimeBundle): RenderMime.MimeMap<string> {
+    let map: RenderMime.MimeMap<string> = Object.create(null);
+    for (let mimeType in bundle) {
+      let value = bundle[mimeType];
+      if (Array.isArray(value)) {
+        map[mimeType] = (value as string[]).join('\n');
+      } else {
+        map[mimeType] = value as string;
+      }
+    }
+    return map;
+  }
 }
 
 

+ 2 - 54
src/notebook/output-area/widget.ts

@@ -731,8 +731,8 @@ class OutputWidget extends Widget {
     }
     // Extract the data from the output and sanitize if necessary.
     let rendermime = this._rendermime;
-    let bundle = this.getBundle(output as nbformat.IOutput);
-    let data = this.convertBundle(bundle);
+    let bundle = OutputAreaModel.getBundle(output as nbformat.IOutput);
+    let data = OutputAreaModel.convertBundle(bundle);
     // Clear the content.
     this.clear();
 
@@ -799,58 +799,6 @@ class OutputWidget extends Widget {
     }
   }
 
-  /**
-   * Get the mime bundle for an output.
-   *
-   * @params output - A kernel output message payload.
-   *
-   * @returns - A mime bundle for the payload.
-   */
-  protected getBundle(output: nbformat.IOutput): nbformat.IMimeBundle {
-    let bundle: nbformat.IMimeBundle;
-    switch (output.output_type) {
-    case 'execute_result':
-      bundle = (output as nbformat.IExecuteResult).data;
-      break;
-    case 'display_data':
-      bundle = (output as nbformat.IDisplayData).data;
-      break;
-    case 'stream':
-      let text = (output as nbformat.IStream).text;
-      bundle = {
-        'application/vnd.jupyter.console-text': text
-      };
-      break;
-    case 'error':
-      let out: nbformat.IError = output as nbformat.IError;
-      let traceback = out.traceback.join('\n');
-      bundle = {
-        'application/vnd.jupyter.console-text': traceback ||
-          `${out.ename}: ${out.evalue}`
-      };
-      break;
-    default:
-      break;
-    }
-    return bundle || {};
-  }
-
-  /**
-   * Convert a mime bundle to a mime map.
-   */
-  protected convertBundle(bundle: nbformat.IMimeBundle): RenderMime.MimeMap<string> {
-    let map: RenderMime.MimeMap<string> = Object.create(null);
-    for (let mimeType in bundle) {
-      let value = bundle[mimeType];
-      if (Array.isArray(value)) {
-        map[mimeType] = (value as string[]).join('\n');
-      } else {
-        map[mimeType] = value as string;
-      }
-    }
-    return map;
-  }
-
   private _rendermime: RenderMime = null;
   private _placeholder: Widget = null;
 }

+ 13 - 0
src/rendermime/index.ts

@@ -183,12 +183,25 @@ class RenderMime {
 
   /**
    * Remove a renderer by mimetype.
+   *
+   * @param mimetype - The mimetype of the renderer.
    */
   removeRenderer(mimetype: string): void {
     delete this._renderers[mimetype];
     this._order.remove(mimetype);
   }
 
+  /**
+   * Get a renderer by mimetype.
+   *
+   * @param mimetype - The mimetype of the renderer.
+   *
+   * @returns The renderer for the given mimetype, or undefined if the mimetype is unknown.
+   */
+  getRenderer(mimetype: string): RenderMime.IRenderer {
+    return this._renderers[mimetype];
+  }
+
   private _renderers: RenderMime.MimeMap<RenderMime.IRenderer> = Object.create(null);
   private _order: Vector<string>;
   private _sanitizer: ISanitizer = null;

+ 32 - 0
test/src/notebook/output-area/model.spec.ts

@@ -290,6 +290,38 @@ describe('notebook/output-area/model', () => {
 
     });
 
+    describe('#getBundle()', () => {
+
+      it('should handle all bundle types', () => {
+        for (let i = 0; i < DEFAULT_OUTPUTS.length; i++) {
+          let output = DEFAULT_OUTPUTS[i];
+          let bundle = OutputAreaModel.getBundle(output);
+          expect(Object.keys(bundle).length).to.not.be(0);
+        }
+      });
+
+    });
+
+    describe('#convertBundle()', () => {
+
+      it('should handle bundles with strings', () => {
+        let bundle: nbformat.IMimeBundle = {
+          'text/plain': 'foo'
+        };
+        let map = OutputAreaModel.convertBundle(bundle);
+        expect(map).to.eql(bundle);
+      });
+
+      it('should handle bundles with string arrays', () => {
+        let bundle: nbformat.IMimeBundle = {
+          'text/plain': ['foo', 'bar']
+        };
+        let map = OutputAreaModel.convertBundle(bundle);
+        expect(map).to.eql({ 'text/plain': 'foo\nbar' });
+      });
+
+    });
+
   });
 
 });

+ 0 - 51
test/src/notebook/output-area/widget.spec.ts

@@ -3,10 +3,6 @@
 
 import expect = require('expect.js');
 
-import {
-  nbformat
-} from '@jupyterlab/services';
-
 import {
   Message
 } from 'phosphor/lib/core/messaging';
@@ -19,10 +15,6 @@ import {
   OutputAreaModel, OutputAreaWidget, OutputWidget
 } from '../../../../lib/notebook/output-area';
 
-import {
-  RenderMime
-} from '../../../../lib/rendermime';
-
 import {
   defaultRenderMime
 } from '../../utils';
@@ -69,14 +61,6 @@ class CustomOutputWidget extends OutputWidget {
   setOutput(value: Widget): void {
     super.setOutput(value);
   }
-
-  getBundle(output: nbformat.IOutput): nbformat.IMimeBundle {
-    return super.getBundle(output);
-  }
-
-  convertBundle(bundle: nbformat.IMimeBundle): RenderMime.MimeMap<string> {
-    return super.convertBundle(bundle);
-  }
 }
 
 
@@ -440,41 +424,6 @@ describe('notebook/output-area/widget', () => {
 
     });
 
-    describe('#getBundle()', () => {
-
-      it('should handle all bundle types', () => {
-        let widget = new CustomOutputWidget({ rendermime });
-        for (let i = 0; i < DEFAULT_OUTPUTS.length; i++) {
-          let output = DEFAULT_OUTPUTS[i];
-          let bundle = widget.getBundle(output);
-          expect(Object.keys(bundle).length).to.not.be(0);
-        }
-      });
-
-    });
-
-    describe('#convertBundle()', () => {
-
-      it('should handle bundles with strings', () => {
-        let bundle: nbformat.IMimeBundle = {
-          'text/plain': 'foo'
-        };
-        let widget = new CustomOutputWidget({ rendermime });
-        let map = widget.convertBundle(bundle);
-        expect(map).to.eql(bundle);
-      });
-
-      it('should handle bundles with string arrays', () => {
-        let bundle: nbformat.IMimeBundle = {
-          'text/plain': ['foo', 'bar']
-        };
-        let widget = new CustomOutputWidget({ rendermime });
-        let map = widget.convertBundle(bundle);
-        expect(map).to.eql({ 'text/plain': 'foo\nbar' });
-      });
-
-    });
-
   });
 
 });

+ 14 - 0
test/src/rendermime/rendermime.spec.ts

@@ -217,6 +217,20 @@ describe('rendermime/index', () => {
 
     });
 
+    describe('#getRenderer()', () => {
+
+      it('should get a renderer by mimetype', () => {
+        let r = defaultRenderMime();
+        expect(r.getRenderer('text/plain')).to.be.a(TextRenderer);
+      });
+
+      it('should return undefined for missing mimetype', () => {
+        let r = defaultRenderMime();
+        expect(r.getRenderer('hello/world')).to.be(undefined);
+      });
+
+    });
+
     describe('#mimetypes()', () => {
 
       it('should get the ordered list of mimetypes', () => {