浏览代码

minor code refactoring, for union types and types

Zuoyuan Huang 6 年之前
父节点
当前提交
43a0e26442

+ 31 - 5
packages/toc/src/generators/markdowndocgenerator/index.ts

@@ -11,7 +11,8 @@ import {
   generateNumbering,
   sanitizerOptions,
   isMarkdown,
-  INotebookHeading
+  INotebookHeading,
+  INotebookHeadingTypes
 } from '../shared';
 
 import { IInstanceTracker, ISanitizer } from '@jupyterlab/apputils';
@@ -143,7 +144,13 @@ namespace Private {
         // Take special care to parse markdown links into raw text.
         const text = match[2].replace(/\[(.+)\]\(.+\)/g, '$1');
         let numbering = generateNumbering(numberingDict, level);
-        headings.push({ text, numbering, level, onClick, type: 'header' });
+        headings.push({
+          text,
+          numbering,
+          level,
+          onClick,
+          type: INotebookHeadingTypes.header
+        });
         return;
       }
 
@@ -154,7 +161,13 @@ namespace Private {
         // Take special care to parse markdown links into raw text.
         const text = lines[idx - 1].replace(/\[(.+)\]\(.+\)/g, '$1');
         let numbering = generateNumbering(numberingDict, level);
-        headings.push({ text, numbering, level, onClick, type: 'header' });
+        headings.push({
+          text,
+          numbering,
+          level,
+          onClick,
+          type: INotebookHeadingTypes.header
+        });
         return;
       }
 
@@ -166,7 +179,13 @@ namespace Private {
         const level = parseInt(match[1], 10);
         const text = match[2];
         let numbering = generateNumbering(numberingDict, level);
-        headings.push({ text, numbering, level, onClick, type: 'header' });
+        headings.push({
+          text,
+          numbering,
+          level,
+          onClick,
+          type: INotebookHeadingTypes.header
+        });
         return;
       }
     });
@@ -206,7 +225,14 @@ namespace Private {
         '</span>';
       heading.innerHTML = numberingElement + html;
       text = text.replace('¶', '');
-      headings.push({ level, text, numbering, html, onClick, type: 'header' });
+      headings.push({
+        level,
+        text,
+        numbering,
+        html,
+        onClick,
+        type: INotebookHeadingTypes.header
+      });
     }
     return headings;
   }

+ 2 - 2
packages/toc/src/generators/markdowndocgenerator/itemrenderer.tsx

@@ -3,7 +3,7 @@
 
 import { MarkdownDocGeneratorOptionsManager } from './optionsmanager';
 
-import { INotebookHeading } from '../shared';
+import { INotebookHeading, INotebookHeadingTypes } from '../shared';
 
 import * as React from 'react';
 
@@ -21,7 +21,7 @@ export function markdownDocItemRenderer(
   };
   let fontSize = '9px';
   let numbering = item.numbering && options.numbering ? item.numbering : '';
-  if (item.type === 'header') {
+  if (item.type === INotebookHeadingTypes.header) {
     fontSize = levelsSizes[item.level] + 'px';
   }
   let jsx = <span style={{ fontSize }}> {numbering + item.text}</span>;

+ 33 - 14
packages/toc/src/generators/notebookgenerator/index.ts

@@ -23,7 +23,8 @@ import {
   getMarkdownHeadings,
   isDOM,
   isMarkdown,
-  INotebookHeading
+  INotebookHeading,
+  INotebookHeadingTypes
 } from '../shared';
 
 /**
@@ -159,7 +160,10 @@ export function createNotebookGenerator(
               cell
             );
             let renderedHeading = renderedHeadings[0];
-            if (renderedHeading && renderedHeading.type === 'markdown') {
+            if (
+              renderedHeading &&
+              renderedHeading.type === INotebookHeadingTypes.markdown
+            ) {
               if (
                 currentCollapseLevel < 0 &&
                 !Private.headingIsFilteredOut(
@@ -169,10 +173,13 @@ export function createNotebookGenerator(
               ) {
                 headings = headings.concat(renderedHeadings);
               }
-            } else if (renderedHeading && renderedHeading.type === 'header') {
+            } else if (
+              renderedHeading &&
+              renderedHeading.type === INotebookHeadingTypes.header
+            ) {
               if (
                 prevHeading &&
-                prevHeading.type === 'header' &&
+                prevHeading.type === INotebookHeadingTypes.header &&
                 prevHeading.level >= renderedHeading.level
               ) {
                 prevHeading.hasChild = false;
@@ -210,7 +217,7 @@ export function createNotebookGenerator(
               )
             ) {
               if (
-                !(renderedHeading.type === 'markdown') ||
+                !(renderedHeading.type === INotebookHeadingTypes.markdown) ||
                 options.showMarkdown
               ) {
                 prevHeading = renderedHeading;
@@ -257,7 +264,10 @@ export function createNotebookGenerator(
               cell
             );
             let renderedHeading = renderedHeadings[0];
-            if (renderedHeading && renderedHeading.type === 'markdown') {
+            if (
+              renderedHeading &&
+              renderedHeading.type === INotebookHeadingTypes.markdown
+            ) {
               if (
                 currentCollapseLevel < 0 &&
                 !Private.headingIsFilteredOut(
@@ -267,10 +277,13 @@ export function createNotebookGenerator(
               ) {
                 headings = headings.concat(renderedHeadings);
               }
-            } else if (renderedHeading && renderedHeading.type === 'header') {
+            } else if (
+              renderedHeading &&
+              renderedHeading.type === INotebookHeadingTypes.header
+            ) {
               if (
                 prevHeading &&
-                prevHeading.type === 'header' &&
+                prevHeading.type === INotebookHeadingTypes.header &&
                 prevHeading.level >= renderedHeading.level
               ) {
                 prevHeading.hasChild = false;
@@ -308,7 +321,7 @@ export function createNotebookGenerator(
               )
             ) {
               if (
-                !(renderedHeading.type === 'markdown') ||
+                !(renderedHeading.type === INotebookHeadingTypes.markdown) ||
                 options.showMarkdown
               ) {
                 prevHeading = renderedHeading;
@@ -343,7 +356,10 @@ export function createNotebookGenerator(
               cell
             );
             let renderedHeading = renderedHeadings[0];
-            if (renderedHeading && renderedHeading.type === 'markdown') {
+            if (
+              renderedHeading &&
+              renderedHeading.type === INotebookHeadingTypes.markdown
+            ) {
               if (
                 currentCollapseLevel < 0 &&
                 !Private.headingIsFilteredOut(
@@ -353,10 +369,13 @@ export function createNotebookGenerator(
               ) {
                 headings = headings.concat(renderedHeadings);
               }
-            } else if (renderedHeading && renderedHeading.type === 'header') {
+            } else if (
+              renderedHeading &&
+              renderedHeading.type === INotebookHeadingTypes.header
+            ) {
               if (
                 prevHeading &&
-                prevHeading.type === 'header' &&
+                prevHeading.type === INotebookHeadingTypes.header &&
                 prevHeading.level >= renderedHeading.level
               ) {
                 prevHeading.hasChild = false;
@@ -428,7 +447,7 @@ namespace Private {
     if (headings.length > 0) {
       let location = headings.length - 1;
       while (location >= 0) {
-        if (headings[location].type === 'header') {
+        if (headings[location].type === INotebookHeadingTypes.header) {
           return headings[location].level;
         }
         location = location - 1;
@@ -460,7 +479,7 @@ namespace Private {
         text: headingText,
         level,
         onClick,
-        type: 'code',
+        type: INotebookHeadingTypes.code,
         prompt: executionCount,
         cellRef: cellRef,
         hasChild: false

+ 21 - 8
packages/toc/src/generators/notebookgenerator/itemrenderer.tsx

@@ -7,7 +7,11 @@ import { Cell } from '@jupyterlab/cells';
 
 import { NotebookGeneratorOptionsManager } from './optionsmanager';
 
-import { sanitizerOptions, INotebookHeading } from '../shared';
+import {
+  sanitizerOptions,
+  INotebookHeading,
+  INotebookHeadingTypes
+} from '../shared';
 
 import * as React from 'react';
 
@@ -24,7 +28,10 @@ export function notebookItemRenderer(
     6: '10'
   };
   let jsx;
-  if (item.type === 'markdown' || item.type === 'header') {
+  if (
+    item.type === INotebookHeadingTypes.markdown ||
+    item.type === INotebookHeadingTypes.header
+  ) {
     const paddingLeft = 24;
     const collapseOnClick = (cellRef?: Cell) => {
       let collapsed = cellRef!.model.metadata.get(
@@ -36,10 +43,13 @@ export function notebookItemRenderer(
     };
     let fontSize = '9px';
     let numbering = item.numbering && options.numbering ? item.numbering : '';
-    if (item.type === 'header') {
+    if (item.type === INotebookHeadingTypes.header) {
       fontSize = levelsSizes[item.level] + 'px';
     }
-    if (item.html && (item.type === 'header' || options.showMarkdown)) {
+    if (
+      item.html &&
+      (item.type === INotebookHeadingTypes.header || options.showMarkdown)
+    ) {
       jsx = (
         <span
           dangerouslySetInnerHTML={{
@@ -51,7 +61,7 @@ export function notebookItemRenderer(
           style={{ fontSize, paddingLeft }}
         />
       );
-      if (item.type === 'header') {
+      if (item.type === INotebookHeadingTypes.header) {
         let collapsed = item.cellRef!.model.metadata.get(
           'toc-hr-collapsed'
         ) as boolean;
@@ -95,13 +105,16 @@ export function notebookItemRenderer(
           </div>
         );
       }
-    } else if (item.type === 'header' || options.showMarkdown) {
+    } else if (
+      item.type === INotebookHeadingTypes.header ||
+      options.showMarkdown
+    ) {
       jsx = (
         <span className={item.type + '-cell'} style={{ fontSize, paddingLeft }}>
           {numbering + item.text}
         </span>
       );
-      if (item.type === 'header') {
+      if (item.type === INotebookHeadingTypes.header) {
         let collapsed = item.cellRef!.model.metadata.get(
           'toc-hr-collapsed'
         ) as boolean;
@@ -148,7 +161,7 @@ export function notebookItemRenderer(
     } else {
       jsx = null;
     }
-  } else if (item.type === 'code' && options.showCode) {
+  } else if (item.type === INotebookHeadingTypes.code && options.showCode) {
     jsx = (
       <div className="toc-code-cell-div">
         <div className="toc-code-cell-prompt">{item.prompt}</div>

+ 16 - 8
packages/toc/src/generators/shared.ts

@@ -6,9 +6,15 @@ const VDOM_MIME_TYPE = 'application/vdom.v1+json';
 
 const HTML_MIME_TYPE = 'text/html';
 
+export enum INotebookHeadingTypes {
+  header,
+  markdown,
+  code
+}
+
 export interface INotebookHeading extends IHeading {
   numbering?: string | null;
-  type: string;
+  type: INotebookHeadingTypes;
   prompt?: string;
   cellRef?: Cell;
   hasChild?: boolean;
@@ -60,12 +66,14 @@ export function getRenderedHTMLHeadings(
     let markdownCell = headingNodes[0];
     if (markdownCell.nodeName.toLowerCase() === 'p') {
       if (markdownCell.innerHTML) {
+        let html = sanitizer.sanitize(markdownCell.innerHTML, sanitizerOptions);
+        html = html.replace('¶', '');
         headings.push({
           level: lastLevel + 1,
-          html: markdownCell.innerHTML,
+          html: html,
           text: markdownCell.textContent ? markdownCell.textContent : '',
           onClick: onClickFactory(markdownCell),
-          type: 'markdown',
+          type: INotebookHeadingTypes.markdown,
           cellRef: cellRef,
           hasChild: true
         });
@@ -97,7 +105,7 @@ export function getRenderedHTMLHeadings(
         numbering,
         html,
         onClick,
-        type: 'header',
+        type: INotebookHeadingTypes.header,
         cellRef: cellRef,
         hasChild: true
       });
@@ -141,7 +149,7 @@ export function getMarkdownHeadings(
       level,
       numbering,
       onClick,
-      type: 'header',
+      type: INotebookHeadingTypes.header,
       cellRef: cellRef,
       hasChild: true
     });
@@ -158,7 +166,7 @@ export function getMarkdownHeadings(
       level,
       numbering,
       onClick,
-      type: 'header',
+      type: INotebookHeadingTypes.header,
       cellRef: cellRef,
       hasChild: true
     });
@@ -176,7 +184,7 @@ export function getMarkdownHeadings(
       level,
       numbering,
       onClick,
-      type: 'header',
+      type: INotebookHeadingTypes.header,
       cellRef: cellRef,
       hasChild: true
     });
@@ -185,7 +193,7 @@ export function getMarkdownHeadings(
       text: line,
       level: lastLevel + 1,
       onClick,
-      type: 'markdown',
+      type: INotebookHeadingTypes.markdown,
       cellRef: cellRef,
       hasChild: false
     });

+ 3 - 3
packages/toc/src/toc.tsx

@@ -107,8 +107,8 @@ export class TableOfContents extends Widget {
     ) => {
       return <span>{item.text}</span>;
     };
-    if (this._current && this._current!.generator.itemRenderer) {
-      itemRenderer = this._current!.generator.itemRenderer!;
+    if (this._current && this._current.generator.itemRenderer) {
+      itemRenderer = this._current.generator.itemRenderer!;
     }
     let renderedJSX = (
       <div className="jp-TableOfContents">
@@ -216,7 +216,7 @@ export interface IHeading {
    * For instance, this can be used to render
    * already-renderd-to-html markdown headings.
    */
-  html?: string | null;
+  html?: string;
 }
 
 /**