2
2
3
3
import 'katex/dist/katex.min.css'
4
4
5
- import { useIsomorphicLayoutEffect } from 'foxact/use-isomorphic-layout-effect'
6
5
import type { MarkdownToJSX } from 'markdown-to-jsx'
7
6
import { blockRegex , Priority , simpleInlineRegex } from 'markdown-to-jsx'
8
- import type { FC } from 'react'
9
- import { useState } from 'react '
7
+
8
+ import { KateX } from '../../katex '
10
9
11
10
// $ c = \pm\sqrt{a^2 + b^2} $
12
11
export const KateXRule : MarkdownToJSX . Rule = {
13
- match : simpleInlineRegex (
14
- / ^ (? ! \\ ) \$ \s * ( (?: \[ (?: [ ^ $ ] | (? = \\ ) \$ ) * ?\] | < (?: [ ^ $ ] | (? = \\ ) \$ ) * ?> (?: (?: [ ^ $ ] | (? = \\ ) \$ ) * ?< (?: [ ^ $ ] | (? = \\ ) \$ ) * ?> ) ? | ` (?: [ ^ $ ] | (? = \\ ) \$ ) * ?` | [ ^ $ ] | (? = \\ ) \$ ) * ?) \s * (? ! \\ ) \$ / ,
15
- ) ,
16
- order : Priority . MED ,
12
+ match : ( source ) => {
13
+ return simpleInlineRegex (
14
+ / ^ (? ! \\ ) \$ \s * ( (?: \[ (?: [ ^ $ ] | (? = \\ ) \$ ) * ?\] | < (?: [ ^ $ ] | (? = \\ ) \$ ) * ?> (?: (?: [ ^ $ ] | (? = \\ ) \$ ) * ?< (?: [ ^ $ ] | (? = \\ ) \$ ) * ?> ) ? | ` (?: [ ^ $ ] | (? = \\ ) \$ ) * ?` | [ ^ $ ] | (? = \\ ) \$ ) * ?) \s * (? ! \\ ) \$ / ,
15
+ ) ( source , { inline : true } )
16
+ } ,
17
+ order : Priority . LOW ,
17
18
parse ( capture ) {
18
19
return {
19
20
type : 'kateX' ,
20
21
katex : capture [ 1 ] ,
21
22
}
22
23
} ,
23
24
react ( node , output , state ) {
24
- return < LateX key = { state ?. key } > { node . katex } </ LateX >
25
+ return < KateX key = { state ?. key } > { node . katex } </ KateX >
25
26
} ,
26
27
}
27
-
28
- type LateXProps = {
29
- children : string
30
- mode ?: string // If `display` the math will be rendered in display mode. Otherwise the math will be rendered in inline mode.
31
- }
32
-
33
- const LateX : FC < LateXProps > = ( props ) => {
34
- const { children, mode } = props
35
-
36
- const [ html , setHtml ] = useState ( '' )
37
-
38
- const displayMode = mode === 'display'
39
-
40
- const throwOnError = false // render unsupported commands as text instead of throwing a `ParseError`
41
-
42
- useIsomorphicLayoutEffect ( ( ) => {
43
- let isMounted = true
44
- import ( 'katex' ) . then ( ( katex ) => {
45
- if ( ! isMounted ) return
46
- // biome-ignore lint/correctness/noUnsafeOptionalChaining: <explanation>
47
- const html = ( katex ?. default ?. renderToString || katex ?. renderToString ) (
48
- children ,
49
- {
50
- displayMode,
51
- throwOnError,
52
- } ,
53
- )
54
-
55
- setHtml ( html )
56
- } )
57
- return ( ) => {
58
- isMounted = false
59
- }
60
- } , [ ] )
61
-
62
- return (
63
- < span
64
- dangerouslySetInnerHTML = { { __html : html } }
65
- className = "katex-container"
66
- />
67
- )
68
- }
69
-
70
28
export const KateXBlockRule : MarkdownToJSX . Rule = {
71
29
match : blockRegex (
72
30
new RegExp ( `^\\s*\\$\\$ *(?<content>[\\s\\S]+?)\\s*\\$\\$ *(?:\n *)+\n?` ) ,
73
31
) ,
74
32
75
- order : Priority . LOW ,
33
+ order : Priority . MED ,
76
34
parse ( capture ) {
77
35
return {
78
36
type : 'kateXBlock' ,
@@ -82,7 +40,7 @@ export const KateXBlockRule: MarkdownToJSX.Rule = {
82
40
react ( node , _ , state ?) {
83
41
return (
84
42
< div className = "scrollbar-none overflow-auto" key = { state ?. key } >
85
- < LateX mode = "display" > { node . groups . content } </ LateX >
43
+ < KateX mode = "display" > { node . groups . content } </ KateX >
86
44
</ div >
87
45
)
88
46
} ,
0 commit comments