S. Chris Colbert vor 7 Jahren
Ursprung
Commit
ad57ccd810

+ 32 - 24
packages/rendermime/src/factories.ts

@@ -15,6 +15,7 @@ import * as Renderers
  */
 export
 const htmlRendererFactory: IRenderMime.IRendererFactory = {
+  safe: true,
   mimeTypes: ['text/html'],
   createRenderer: options => new Renderers.RenderedHTML(options)
 };
@@ -25,26 +26,18 @@ const htmlRendererFactory: IRenderMime.IRendererFactory = {
  */
 export
 const imageRendererFactory: IRenderMime.IRendererFactory = {
+  safe: true,
   mimeTypes: ['image/png', 'image/jpeg', 'image/gif'],
   createRenderer: options => new Renderers.RenderedImage(options)
 };
 
 
-/**
- * A mime renderer factory for javascript.
- */
-export
-const javaScriptRendererFactory: IRenderMime.IRendererFactory = {
-  mimeTypes: ['text/javascript', 'application/javascript'],
-  createRenderer: options => new Renderers.RenderedJavaScript(options)
-};
-
-
 /**
  * A mime renderer factory for LaTeX.
  */
 export
 const latexRendererFactory: IRenderMime.IRendererFactory = {
+  safe: true,
   mimeTypes: ['text/latex'],
   createRenderer: options => new Renderers.RenderedLatex(options)
 };
@@ -55,16 +48,40 @@ const latexRendererFactory: IRenderMime.IRendererFactory = {
  */
 export
 const markdownRendererFactory: IRenderMime.IRendererFactory = {
+  safe: true,
   mimeTypes: ['text/markdown'],
   createRenderer: options => new Renderers.RenderedMarkdown(options)
 };
 
 
+/**
+ * A mime renderer factory for text and jupyter console text data.
+ */
+export
+const textRendererFactory: IRenderMime.IRendererFactory = {
+  safe: true,
+  mimeTypes: ['text/plain', 'application/vnd.jupyter.stdout', 'application/vnd.jupyter.stderr'],
+  createRenderer: options => new Renderers.RenderedText(options)
+};
+
+
+/**
+ * A mime renderer factory for javascript.
+ */
+export
+const javaScriptRendererFactory: IRenderMime.IRendererFactory = {
+  safe: false,
+  mimeTypes: ['text/javascript', 'application/javascript'],
+  createRenderer: options => new Renderers.RenderedJavaScript(options)
+};
+
+
 /**
  * A mime renderer factory for pdf.
  */
 export
 const pdfRendererFactory: IRenderMime.IRendererFactory = {
+  safe: false,
   mimeTypes: ['application/pdf'],
   createRenderer: options => new Renderers.RenderedPDF(options)
 };
@@ -75,32 +92,23 @@ const pdfRendererFactory: IRenderMime.IRendererFactory = {
  */
 export
 const svgRendererFactory: IRenderMime.IRendererFactory = {
+  safe: false,
   mimeTypes: ['image/svg+xml'],
   createRenderer: options => new Renderers.RenderedSVG(options)
 };
 
 
-/**
- * A mime renderer factory for text and jupyter console text data.
- */
-export
-const textRendererFactory: IRenderMime.IRendererFactory = {
-  mimeTypes: ['text/plain', 'application/vnd.jupyter.stdout', 'application/vnd.jupyter.stderr'],
-  createRenderer: options => new Renderers.RenderedText(options)
-};
-
-
 /**
  * The builtin factories provided by the package.
  */
 export
 const defaultRendererFactories: ReadonlyArray<IRenderMime.IRendererFactory> = [
-  htmlRendererFactory,
-  imageRendererFactory,
   javaScriptRendererFactory,
-  latexRendererFactory,
+  htmlRendererFactory,
   markdownRendererFactory,
-  pdfRendererFactory,
+  latexRendererFactory,
   svgRendererFactory,
+  imageRendererFactory,
+  pdfRendererFactory,
   textRendererFactory
 ];

+ 106 - 24
packages/rendermime/src/renderhelpers.ts

@@ -39,7 +39,92 @@ import {
  */
 export
 namespace RenderHelpers {
+  /**
+   * Render HTML into a host node.
+   *
+   * @params options - The options for rendering.
+   *
+   * @returns A promise which resolves when rendering is complete.
+   */
+  export
+  function renderHTML(options: renderHTML.IOptions): Promise<void> {
+    // Unpack the options.
+    let {
+      node, source, trusted, sanitizer, resolver, linkHandler, shouldTypeset
+    } = options;
+
+    // Clear the content if there is no source.
+    if (!source) {
+      node.textContent = '';
+      return Promise.resolve(undefined);
+    }
+
+    // Sanitize the source if it is not trusted.
+    if (!trusted) {
+      source = sanitizer.sanitize(source);
+    }
+
+    // Set the inner HTML to the source.
+    node.innerHTML = source;
+
+    // Patch the urls if a resolver is available.
+    let promise: Promise<void>;
+    if (resolver) {
+      promise = Private.handleUrls(node, resolver, linkHandler);
+    } else {
+      promise = Promise.resolve(undefined);
+    }
+
+    // Return the final rendered promise.
+    return promise.then(() => { if (shouldTypeset) { typeset(node); } });
+  }
+
+  /**
+   * The namespace for the `RenderedHTML` class statics.
+   */
+  export
+  namespace renderHTML {
+    /**
+     * The options for the `renderHTML` function.
+     */
+    export
+    interface IOptions {
+      /**
+       * The node to use as the host of the rendered HTML.
+       */
+      node: HTMLElement;
+
+      /**
+       * The HTML source to render.
+       */
+      source: string;
+
+      /**
+       * Whether the source is trusted.
+       */
+      trusted: boolean;
+
+      /**
+       * The html sanitizer.
+       */
+      sanitizer: ISanitizer;
+
+      /**
+       * An optional url resolver.
+       */
+      resolver: IRenderMime.IResolver | null;
 
+      /**
+       * An optional link handler.
+       */
+      linkHandler: IRenderMime.ILinkHandler | null;
+
+      /**
+       * Whether the node should be typeset.
+       */
+      shouldTypeset: boolean;
+    }
+  }
 
   /**
    * Render Markdown into a host node.
@@ -61,9 +146,6 @@ namespace RenderHelpers {
       return Promise.resolve(undefined);
     }
 
-    // Initialize the marked library if necessary.
-    Private.initializeMarked();
-
     // Separate math from normal markdown text.
     let parts = removeMath(source);
 
@@ -530,6 +612,27 @@ namespace RenderHelpers {
  * The namespace for module implementation details.
  */
 namespace Private {
+  /**
+   * Render markdown for the specified content.
+   *
+   * @param content - The string of markdown to render.
+   *
+   * @return A promise which resolves with the rendered content.
+   */
+  export
+  function renderMarked(content: string): Promise<string> {
+    initializeMarked();
+    return new Promise<string>((resolve, reject) => {
+      marked(content, (err: any, content: string) => {
+        if (err) {
+          reject(err);
+        } else {
+          resolve(content);
+        }
+      });
+    });
+  }
+
   /**
    * Resolve the relative urls in element `src` and `href` attributes.
    *
@@ -647,7 +750,6 @@ namespace Private {
   /**
    * Support GitHub flavored Markdown, leave sanitizing to external library.
    */
-  export
   function initializeMarked(): void {
     if (markedInitialized) {
       return;
@@ -691,24 +793,4 @@ namespace Private {
       }
     });
   }
-
-  /**
-   * Render markdown for the specified content.
-   *
-   * @param content - The string of markdown to render.
-   *
-   * @return A promise which resolves with the rendered content.
-   */
-  export
-  function renderMarked(content: string): Promise<string> {
-    return new Promise<string>((resolve, reject) => {
-      marked(content, (err: any, content: string) => {
-        if (err) {
-          reject(err);
-        } else {
-          resolve(content);
-        }
-      });
-    });
-  }
 }

+ 1 - 115
packages/rendermime/src/widgets.ts

@@ -130,7 +130,7 @@ class RenderedHTML extends RenderedHTMLCommon {
    * @returns A promise which resolves when rendering is complete.
    */
   render(model: IRenderMime.IMimeModel): Promise<void> {
-    return RenderedHTML.renderHTML({
+    return RenderHelpers.renderHTML({
       node: this.node,
       source: String(model.data[this.mimeType]),
       trusted: model.trusted,
@@ -150,94 +150,6 @@ class RenderedHTML extends RenderedHTMLCommon {
 }
 
 
-/**
- * The namespace for the `RenderedHTML` class statics.
- */
-export
-namespace RenderedHTML {
-  /**
-   * The options for the `render` function.
-   */
-  export
-  interface IRenderOptions {
-    /**
-     * The node to use as the host of the rendered HTML.
-     */
-    node: HTMLElement;
-
-    /**
-     * The HTML source to render.
-     */
-    source: string;
-
-    /**
-     * Whether the source is trusted.
-     */
-    trusted: boolean;
-
-    /**
-     * The html sanitizer.
-     */
-    sanitizer: ISanitizer;
-
-    /**
-     * An optional url resolver.
-     */
-    resolver: IRenderMime.IResolver | null;
-
-    /**
-     * An optional link handler.
-     */
-    linkHandler: IRenderMime.ILinkHandler | null;
-
-    /**
-     * Whether the node should be typeset.
-     */
-    shouldTypeset: boolean;
-  }
-
-  /**
-   * Render HTML into a host node.
-   *
-   * @params options - The options for rendering.
-   *
-   * @returns A promise which resolves when rendering is complete.
-   */
-  export
-  function render(options: renderHTML.IOptions): Promise<void> {
-    // Unpack the options.
-    let {
-      node, source, trusted, sanitizer, resolver, linkHandler, shouldTypeset
-    } = options;
-
-    // Clear the content if there is no source.
-    if (!source) {
-      node.textContent = '';
-      return Promise.resolve(undefined);
-    }
-
-    // Sanitize the source if it is not trusted.
-    if (!trusted) {
-      source = sanitizer.sanitize(source);
-    }
-
-    // Set the inner HTML to the source.
-    node.innerHTML = source;
-
-    // Patch the urls if a resolver is available.
-    let promise: Promise<void>;
-    if (resolver) {
-      promise = Private.handleUrls(node, resolver, linkHandler);
-    } else {
-      promise = Promise.resolve(undefined);
-    }
-
-    // Return the final rendered promise.
-    return promise.then(() => { if (shouldTypeset) { typeset(node); } });
-  }
-}
-
-
 /**
  * A mime renderer for displaying Markdown with embeded latex.
  */
@@ -486,29 +398,3 @@ class RenderedPDF extends RenderedCommon {
     });
   }
 }
-
-
-/**
- * The namespace for module implementation details.
- */
-namespace Private {
-  /**
-   * Test whether two mime models are equivalent.
-   */
-  export
-  function equalModels(a: IRenderMime.IMimeModel, b: IRenderMime.IMimeModel): boolean {
-    if (a === b) {
-      return true;
-    }
-    if (a.trusted !== b.trusted) {
-      return false;
-    }
-    if (a.data !== b.data) {
-      return false;
-    }
-    if (a.metadata !== b.metadata) {
-      return false;
-    }
-    return true;
-  }
-}