Browse Source

Add generator for rendered markdown.

Ian Rose 6 years ago
parent
commit
b6bf1e49b8
2 changed files with 47 additions and 2 deletions
  1. 11 0
      packages/toc/src/extension.ts
  2. 36 2
      packages/toc/src/generators.ts

+ 11 - 0
packages/toc/src/extension.ts

@@ -3,6 +3,7 @@
 
 import {
   ILayoutRestorer,
+  IMimeDocumentTracker,
   JupyterLab,
   JupyterLabPlugin,
 } from '@jupyterlab/application';
@@ -21,6 +22,7 @@ import {
   createLatexGenerator,
   createNotebookGenerator,
   createMarkdownGenerator,
+  createRenderedMarkdownGenerator,
 } from './generators';
 
 import {ITableOfContentsRegistry, TableOfContentsRegistry} from './registry';
@@ -38,6 +40,7 @@ const extension: JupyterLabPlugin<ITableOfContentsRegistry> = {
     IDocumentManager,
     IEditorTracker,
     ILayoutRestorer,
+    IMimeDocumentTracker,
     INotebookTracker,
     IRenderMimeRegistry,
   ],
@@ -52,6 +55,7 @@ function activateTOC(
   docmanager: IDocumentManager,
   editorTracker: IEditorTracker,
   restorer: ILayoutRestorer,
+  mimeDocumentTracker: IMimeDocumentTracker,
   notebookTracker: INotebookTracker,
   rendermime: IRenderMimeRegistry,
 ): ITableOfContentsRegistry {
@@ -80,6 +84,13 @@ function activateTOC(
   const markdownGenerator = createMarkdownGenerator(editorTracker);
   registry.addGenerator(markdownGenerator);
 
+  // Create an rendered markdown editor TableOfContentsRegistry.IGenerator
+  const renderedMarkdownGenerator = createRenderedMarkdownGenerator(
+    mimeDocumentTracker,
+    rendermime.sanitizer
+  );
+  registry.addGenerator(renderedMarkdownGenerator);
+
   // Create a latex editor TableOfContentsRegistry.IGenerator
   const latexGenerator = createLatexGenerator(editorTracker);
   registry.addGenerator(latexGenerator);

+ 36 - 2
packages/toc/src/generators.ts

@@ -1,11 +1,11 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
-import {ISanitizer} from '@jupyterlab/apputils';
+import {IInstanceTracker, ISanitizer} from '@jupyterlab/apputils';
 
 import {CodeCell, CodeCellModel, MarkdownCell} from '@jupyterlab/cells';
 
-import {IDocumentWidget} from '@jupyterlab/docregistry';
+import {IDocumentWidget, MimeDocument} from '@jupyterlab/docregistry';
 
 import {FileEditor, IEditorTracker} from '@jupyterlab/fileeditor';
 
@@ -141,6 +141,40 @@ export function createMarkdownGenerator(
   };
 }
 
+/**
+ * Create a TOC generator for rendered markdown files.
+ *
+ * @param tracker: A file editor tracker.
+ *
+ * @returns A TOC generator that can parse markdown files.
+ */
+export function createRenderedMarkdownGenerator(
+  tracker: IInstanceTracker<MimeDocument>,
+  sanitizer: ISanitizer,
+): TableOfContentsRegistry.IGenerator<MimeDocument> {
+  return {
+    tracker,
+    usesLatex: true,
+    isEnabled: widget => {
+      // Only enable this if the editor mimetype matches
+      // one of a few markdown variants.
+      return Private.isMarkdown(widget.content.mimeType);
+    },
+    generate: widget => {
+      const onClickFactory = (el: Element) => {
+        return () => {
+          el.scrollIntoView();
+        };
+      };
+      return Private.getRenderedHTMLHeadings(
+        widget.content.node,
+        onClickFactory,
+        sanitizer,
+      );
+    },
+  };
+}
+
 /**
  * Create a TOC generator for LaTeX files.
  *