@@ -8,14 +8,15 @@ import { PromiseDelegate } from '@lumino/coreutils';
8
8
import React , { useState , useEffect } from 'react' ;
9
9
import { createPortal } from 'react-dom' ;
10
10
11
- import { CodeToolbar , CodeToolbarProps } from './code-blocks/code-toolbar' ;
12
- import { MessageToolbar } from './toolbar' ;
13
- import { IChatModel } from '../model' ;
11
+ import { CodeToolbar , CodeToolbarProps } from '../code-blocks/code-toolbar' ;
12
+ import { MessageToolbar } from '../toolbar' ;
13
+ import { MarkdownRenderer , MD_RENDERED_CLASS } from '../../markdown-renderer' ;
14
+ import { IChatModel } from '../../model' ;
14
15
15
- const MD_MIME_TYPE = 'text/markdown' ;
16
- const MD_RENDERED_CLASS = 'jp-chat-rendered-markdown' ;
17
-
18
- type MarkdownRendererProps = {
16
+ /**
17
+ * The type of the props for the MessageRenderer component.
18
+ */
19
+ type MessageRendererProps = {
19
20
/**
20
21
* The string to render.
21
22
*/
@@ -47,22 +48,10 @@ type MarkdownRendererProps = {
47
48
} ;
48
49
49
50
/**
50
- * Escapes backslashes in LaTeX delimiters such that they appear in the DOM
51
- * after the initial MarkDown render. For example, this function takes '\(` and
52
- * returns `\\(`.
53
- *
54
- * Required for proper rendering of MarkDown + LaTeX markup in the chat by
55
- * `ILatexTypesetter`.
51
+ * The message renderer base component.
56
52
*/
57
- function escapeLatexDelimiters ( text : string ) {
58
- return text
59
- . replace ( / \\ \( / g, '\\\\(' )
60
- . replace ( / \\ \) / g, '\\\\)' )
61
- . replace ( / \\ \[ / g, '\\\\[' )
62
- . replace ( / \\ \] / g, '\\\\]' ) ;
63
- }
64
-
65
- function MarkdownRendererBase ( props : MarkdownRendererProps ) : JSX . Element {
53
+ function MessageRendererBase ( props : MessageRendererProps ) : JSX . Element {
54
+ const { markdownStr, rmRegistry } = props ;
66
55
const appendContent = props . appendContent || false ;
67
56
const [ renderedContent , setRenderedContent ] = useState < HTMLElement | null > (
68
57
null
@@ -75,26 +64,11 @@ function MarkdownRendererBase(props: MarkdownRendererProps): JSX.Element {
75
64
76
65
useEffect ( ( ) => {
77
66
const renderContent = async ( ) => {
78
- // initialize mime model
79
- const mdStr = escapeLatexDelimiters ( props . markdownStr ) ;
80
- const model = props . rmRegistry . createModel ( {
81
- data : { [ MD_MIME_TYPE ] : mdStr }
67
+ const renderer = await MarkdownRenderer . renderContent ( {
68
+ content : markdownStr ,
69
+ rmRegistry
82
70
} ) ;
83
71
84
- const renderer = props . rmRegistry . createRenderer ( MD_MIME_TYPE ) ;
85
-
86
- // step 1: render markdown
87
- await renderer . renderModel ( model ) ;
88
- props . rmRegistry . latexTypesetter ?. typeset ( renderer . node ) ;
89
- if ( ! renderer . node ) {
90
- throw new Error (
91
- 'Rendermime was unable to render Markdown content within a chat message. Please report this upstream to Jupyter chat on GitHub.'
92
- ) ;
93
- }
94
-
95
- // step 2: render LaTeX via MathJax.
96
- props . rmRegistry . latexTypesetter ?. typeset ( renderer . node ) ;
97
-
98
72
const newCodeToolbarDefns : [ HTMLDivElement , CodeToolbarProps ] [ ] = [ ] ;
99
73
100
74
// Attach CodeToolbar root element to each <pre> block
@@ -119,7 +93,7 @@ function MarkdownRendererBase(props: MarkdownRendererProps): JSX.Element {
119
93
} ;
120
94
121
95
renderContent ( ) ;
122
- } , [ props . markdownStr , props . rmRegistry ] ) ;
96
+ } , [ markdownStr , rmRegistry ] ) ;
123
97
124
98
return (
125
99
< div className = { MD_RENDERED_CLASS } >
@@ -146,4 +120,4 @@ function MarkdownRendererBase(props: MarkdownRendererProps): JSX.Element {
146
120
) ;
147
121
}
148
122
149
- export const MarkdownRenderer = React . memo ( MarkdownRendererBase ) ;
123
+ export const MessageRenderer = React . memo ( MessageRendererBase ) ;
0 commit comments