Procházet zdrojové kódy

Clean up the rendermime api

Steven Silvester před 8 roky
rodič
revize
afb440bf2b
2 změnil soubory, kde provedl 44 přidání a 41 odebrání
  1. 33 27
      src/rendermime/index.ts
  2. 11 14
      test/src/rendermime/rendermime.spec.ts

+ 33 - 27
src/rendermime/index.ts

@@ -1,10 +1,22 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
+import {
+  IIterable, IterableOrArrayLike
+} from 'phosphor/lib/algorithm/iteration';
+
 import {
   JSONObject
 } from 'phosphor/lib/algorithm/json';
 
+import {
+  find
+} from 'phosphor/lib/algorithm/searching';
+
+import {
+  Vector
+} from 'phosphor/lib/collections/vector';
+
 import {
   Token
 } from 'phosphor/lib/core/token';
@@ -59,25 +71,11 @@ class RenderMime {
     for (let mime in options.renderers) {
       this._renderers[mime] = options.renderers[mime];
     }
-    this._order = options.order.slice();
+    this._order = new Vector(options.order);
     this._sanitizer = options.sanitizer;
     this._resolver = options.resolver || null;
   }
 
-  /**
-   * The ordered list of mimetypes.
-   *
-   * #### Notes
-   * These mimetypes are searched from beginning to end, and the first matching
-   * mimetype is used.
-   */
-  get order(): string[] {
-    return this._order.slice();
-  }
-  set order(value: string[]) {
-    this._order = value.slice();
-  }
-
   /**
    * The object used to resolve relative urls for the rendermime instance.
    */
@@ -88,6 +86,17 @@ class RenderMime {
     this._resolver = value;
   }
 
+  /**
+   * Get an iterator over the ordered list of mimetypes.
+   *
+   * #### Notes
+   * These mimetypes are searched from beginning to end, and the first matching
+   * mimetype is used.
+   */
+  mimetypes(): IIterable<string> {
+    return this._order.iter();
+  }
+
   /**
    * Render a mimebundle.
    *
@@ -129,14 +138,14 @@ class RenderMime {
    * (see [[RenderMime.IRenderer.isSanitizable]]).
    */
   preferredMimetype(bundle: RenderMime.MimeMap<string | JSONObject>, trusted=false): string {
-    for (let m of this.order) {
+    return find(this._order, m => {
       if (m in bundle) {
         let renderer = this._renderers[m];
         if (trusted || renderer.isSafe(m) || renderer.isSanitizable(m)) {
-          return m;
+          return true;
         }
       }
-    }
+    });
   }
 
   /**
@@ -145,7 +154,7 @@ class RenderMime {
   clone(): IRenderMime {
     return new RenderMime({
       renderers: this._renderers,
-      order: this.order,
+      order: this._order.iter(),
       sanitizer: this._sanitizer
     });
   }
@@ -164,7 +173,7 @@ class RenderMime {
    */
   addRenderer(mimetype: string, renderer: RenderMime.IRenderer, index = 0): void {
     this._renderers[mimetype] = renderer;
-    this._order.splice(index, 0, mimetype);
+    this._order.insert(index, mimetype);
   }
 
   /**
@@ -172,14 +181,11 @@ class RenderMime {
    */
   removeRenderer(mimetype: string): void {
     delete this._renderers[mimetype];
-    let index = this._order.indexOf(mimetype);
-    if (index !== -1) {
-      this._order.splice(index, 1);
-    }
+    this._order.remove(mimetype);
   }
 
   private _renderers: RenderMime.MimeMap<RenderMime.IRenderer> = Object.create(null);
-  private _order: string[];
+  private _order: Vector<string>;
   private _sanitizer: ISanitizer = null;
   private _resolver: RenderMime.IResolver;
 }
@@ -203,7 +209,7 @@ namespace RenderMime {
     /**
      * A list of mimetypes in order of precedence (earliest has precedence).
      */
-    order: string[];
+    order: IterableOrArrayLike<string>;
 
     /**
      * The sanitizer used to sanitize html inputs.
@@ -238,7 +244,7 @@ namespace RenderMime {
     /**
      * The mimetypes this renderer accepts.
      */
-    mimetypes: string[];
+    readonly mimetypes: string[];
 
     /**
      * Whether the input is safe without sanitization.

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

@@ -3,6 +3,10 @@
 
 import expect = require('expect.js');
 
+import {
+  toArray
+} from 'phosphor/lib/algorithm/iteration';
+
 import {
   JSONObject
 } from 'phosphor/lib/algorithm/json';
@@ -175,7 +179,7 @@ describe('rendermime/index', () => {
       it('should clone the rendermime instance with shallow copies of data', () => {
         let r = defaultRenderMime();
         let c = r.clone();
-        expect(c.order).to.eql(r.order);
+        expect(toArray(c.mimetypes())).to.eql(toArray(r.mimetypes()));
         let t = new TextRenderer();
         c.addRenderer('text/foo', t);
         expect(r).to.not.be(c);
@@ -189,18 +193,18 @@ describe('rendermime/index', () => {
         let r = defaultRenderMime();
         let t = new TextRenderer();
         r.addRenderer('text/foo', t);
-        let index = r.order.indexOf('text/foo');
+        let index = toArray(r.mimetypes()).indexOf('text/foo');
         expect(index).to.be(0);
       });
 
       it('should take an optional order index', () => {
         let r = defaultRenderMime();
         let t = new TextRenderer();
-        let len = r.order.length;
+        let len = toArray(r.mimetypes()).length;
         r.addRenderer('text/foo', t, 0);
-        let index = r.order.indexOf('text/foo');
+        let index = toArray(r.mimetypes()).indexOf('text/foo');
         expect(index).to.be(0);
-        expect(r.order.length).to.be(len + 1);
+        expect(toArray(r.mimetypes()).length).to.be(len + 1);
       });
 
     });
@@ -223,18 +227,11 @@ describe('rendermime/index', () => {
 
     });
 
-    describe('#order', () => {
+    describe('#mimetypes()', () => {
 
       it('should get the ordered list of mimetypes', () => {
         let r = defaultRenderMime();
-        expect(r.order.indexOf('text/html')).to.not.be(-1);
-      });
-
-      it('should set the ordered list of mimetypes', () => {
-        let r = defaultRenderMime();
-        let order = r.order.reverse();
-        r.order = order;
-        expect(r.order).to.eql(order);
+        expect(toArray(r.mimetypes()).indexOf('text/html')).to.not.be(-1);
       });
 
     });