浏览代码

Use the command linker for rendered links

Steven Silvester 8 年之前
父节点
当前提交
2bbcad4f81
共有 4 个文件被更改,包括 80 次插入21 次删除
  1. 1 1
      src/docregistry/context.ts
  2. 27 4
      src/renderers/widget.ts
  3. 20 2
      src/rendermime/index.ts
  4. 32 14
      src/rendermime/plugin.ts

+ 1 - 1
src/docregistry/context.ts

@@ -380,7 +380,7 @@ class Context<T extends DocumentRegistry.IModel> implements DocumentRegistry.ICo
     }
     let cwd = ContentsManager.dirname(this._path);
     let path = ContentsManager.getAbsolutePath(url, cwd);
-    return this._manager.contents.getDownloadUrl(path);
+    return Promise.resolve(path);
   }
 
   /**

+ 27 - 4
src/renderers/widget.ts

@@ -10,6 +10,10 @@ import * as CodeMirror
 
 import 'codemirror/addon/runmode/runmode';
 
+import {
+  utils
+} from '@jupyterlab/services';
+
 import {
   requireMode
 } from '../codemirror';
@@ -18,6 +22,14 @@ import {
   CodeMirrorEditor
 } from '../codemirror/editor';
 
+import {
+  ICommandLinker
+} from '../commandlinker';
+
+import {
+  CommandIDs
+} from '../filebrowser';
+
 import * as marked
   from 'marked';
 
@@ -155,7 +167,8 @@ class RenderedHTML extends RenderedHTMLCommon {
     }
     appendHtml(this.node, source);
     if (options.resolver) {
-      this._urlResolved = resolveUrls(this.node, options.resolver);
+      this._urlResolved = resolveUrls(this.node, options.resolver,
+                                      options.commandLinker);
     }
   }
 
@@ -194,7 +207,8 @@ class RenderedMarkdown extends RenderedHTMLCommon {
       }
       appendHtml(this.node, content);
       if (options.resolver) {
-        this._urlResolved = resolveUrls(this.node, options.resolver);
+        this._urlResolved = resolveUrls(this.node, options.resolver,
+                                        options.commandLinker);
       }
       this.fit();
       this._rendered = true;
@@ -293,7 +307,8 @@ class RenderedSVG extends Widget {
       throw new Error('SVGRender: Error: Failed to create <svg> element');
     }
     if (options.resolver) {
-      this._urlResolved = resolveUrls(this.node, options.resolver);
+      this._urlResolved = resolveUrls(this.node, options.resolver,
+                                      options.commandLinker);
     }
     this.addClass(SVG_CLASS);
   }
@@ -324,10 +339,13 @@ class RenderedPDF extends Widget {
  *
  * @param resolver - A url resolver.
  *
+ * @param linker - A command linker.
+ *
  * @returns a promise fulfilled when the relative urls have been resolved.
  */
 export
-function resolveUrls(node: HTMLElement, resolver: RenderMime.IResolver): Promise<void> {
+function resolveUrls(node: HTMLElement, resolver: RenderMime.IResolver,
+                     linker: ICommandLinker | null): Promise<void> {
   let imgs = node.getElementsByTagName('img');
   for (let i = 0; i < imgs.length; i++) {
     let img = imgs[i];
@@ -346,6 +364,11 @@ function resolveUrls(node: HTMLElement, resolver: RenderMime.IResolver): Promise
     if (href) {
       return resolver.resolveUrl(href).then(url => {
         anchor.href = url;
+        if (linker && !utils.urlParse(url).protocol) {
+          linker.connectNode(anchor, CommandIDs.open, {
+            path: url
+          });
+        }
         return void 0;
       });
     }

+ 20 - 2
src/rendermime/index.ts

@@ -29,6 +29,10 @@ import {
   ISanitizer
 } from '../common/sanitizer';
 
+import {
+  ICommandLinker
+} from '../commandlinker';
+
 import {
   HTMLRenderer, LatexRenderer, ImageRenderer, TextRenderer,
   JavascriptRenderer, SVGRenderer, MarkdownRenderer, PDFRenderer
@@ -79,6 +83,7 @@ class RenderMime {
     this._order = new Vector(options.order);
     this._sanitizer = options.sanitizer;
     this._resolver = options.resolver || null;
+    this._linker = options.commandLinker || null;
   }
 
   /**
@@ -125,7 +130,8 @@ class RenderMime {
       source: bundle[mimetype],
       injector,
       resolver: this._resolver,
-      sanitizer: trusted ? null : this._sanitizer
+      sanitizer: trusted ? null : this._sanitizer,
+      commandLinker: this._linker
     };
     return this._renderers[mimetype].render(rendererOptions);
   }
@@ -160,7 +166,8 @@ class RenderMime {
     return new RenderMime({
       renderers: this._renderers,
       order: this._order.iter(),
-      sanitizer: this._sanitizer
+      sanitizer: this._sanitizer,
+      commandLinker: this._linker
     });
   }
 
@@ -206,6 +213,7 @@ class RenderMime {
   private _order: Vector<string>;
   private _sanitizer: ISanitizer = null;
   private _resolver: RenderMime.IResolver;
+  private _linker: ICommandLinker;
 }
 
 
@@ -240,6 +248,11 @@ namespace RenderMime {
      * The default is `null`.
      */
     resolver?: IResolver;
+
+    /**
+     * The optional command linker object.
+     */
+    commandLinker?: ICommandLinker;
   }
 
   /**
@@ -362,6 +375,11 @@ namespace RenderMime {
      * If given, should be used to sanitize raw html.
      */
     sanitizer?: ISanitizer;
+
+    /**
+     * An optional command linker.
+     */
+    commandLinker: ICommandLinker;
   }
 
   /**

+ 32 - 14
src/rendermime/plugin.ts

@@ -2,13 +2,17 @@
 // Distributed under the terms of the Modified BSD License.
 
 import {
-  JupyterLabPlugin
+  JupyterLabPlugin, JupyterLab
 } from '../application';
 
 import {
   defaultSanitizer
 } from '../common/sanitizer';
 
+import {
+  ICommandLinker
+} from '../commandlinker';
+
 import {
   IRenderMime, RenderMime
 } from './';
@@ -19,20 +23,10 @@ import {
  */
 const plugin: JupyterLabPlugin<IRenderMime> = {
   id: 'jupyter.services.rendermime',
+  requires: [ICommandLinker],
   provides: IRenderMime,
-  activate: (): IRenderMime => {
-    let sanitizer = defaultSanitizer;
-    const transformers = RenderMime.defaultRenderers();
-    let renderers: RenderMime.MimeMap<RenderMime.IRenderer> = {};
-    let order: string[] = [];
-    for (let t of transformers) {
-      for (let m of t.mimetypes) {
-        renderers[m] = t;
-        order.push(m);
-      }
-    }
-    return new RenderMime({ renderers, order, sanitizer });
-  }
+  activate,
+  autoStart: true
 };
 
 
@@ -40,3 +34,27 @@ const plugin: JupyterLabPlugin<IRenderMime> = {
  * Export the plugin as default.
  */
 export default plugin;
+
+
+
+/**
+ * Activate the rendermine plugin.
+ */
+function activate(app: JupyterLab, linker: ICommandLinker): IRenderMime {
+  let sanitizer = defaultSanitizer;
+  const transformers = RenderMime.defaultRenderers();
+  let renderers: RenderMime.MimeMap<RenderMime.IRenderer> = {};
+  let order: string[] = [];
+  for (let t of transformers) {
+    for (let m of t.mimetypes) {
+      renderers[m] = t;
+      order.push(m);
+    }
+  }
+  return new RenderMime({
+    renderers,
+    order,
+    sanitizer,
+    commandLinker: linker
+  });
+};