1
1
'use strict' ;
2
2
3
- const qr = require ( 'qrcode-generator' ) ;
4
3
const visit = require ( 'unist-util-visit' ) ;
5
4
const mdxAstToMdxHast = require ( '@mdx-js/mdx/mdx-ast-to-mdx-hast' ) ;
6
5
const { toJSX } = require ( '@mdx-js/mdx/mdx-hast-to-jsx' ) ;
7
6
const createFusumaProps = require ( './createFusumaProps' ) ;
8
- const transferMarkdownImageNodeToJSX = require ( './transferMarkdownImageNodeToJSX' ) ;
7
+ const transformQrToJSX = require ( './transformers/transformQrToJSX' ) ;
8
+ const transformScreenToJSX = require ( './transformers/transformScreenToJSX' ) ;
9
+ const transformChartToJSX = require ( './transformers/transformChartToJSX' ) ;
10
+ const transformMarkdownImageNodeToJSX = require ( './transformers/transformMarkdownImageNodeToJSX' ) ;
9
11
10
12
function mdxPlugin ( ) {
11
13
return ( tree ) => {
@@ -34,29 +36,17 @@ function mdxPlugin() {
34
36
const attr = rest . map ( ( r ) => r . trim ( ) ) ;
35
37
36
38
if ( prefix === 'qr' ) {
37
- if ( [ 'http' , 'https' ] . includes ( attr [ 0 ] ) ) {
38
- const url = `${ attr [ 0 ] } :${ attr [ 1 ] } ` ;
39
- const q = qr ( 0 , 'L' ) ;
40
- q . addData ( url ) ;
41
- q . make ( ) ;
42
- const svg = q . createSvgTag ( ) ;
43
-
44
- slide . push (
45
- ...[
46
- n ,
47
- {
48
- ...n ,
49
- type : 'jsx' ,
50
- value : svg
51
- . replace ( 'width="58px"' , '' )
52
- . replace ( 'height="58px"' , '' )
53
- . replace ( '<svg ' , '<svg className="qr"' ) ,
54
- } ,
55
- ]
56
- ) ;
57
-
58
- return ;
59
- }
39
+ slide . push (
40
+ ...[
41
+ n ,
42
+ {
43
+ ...n ,
44
+ ...transformQrToJSX ( attr ) ,
45
+ } ,
46
+ ]
47
+ ) ;
48
+
49
+ return ;
60
50
}
61
51
62
52
if ( prefix === 'screen' ) {
@@ -65,19 +55,10 @@ function mdxPlugin() {
65
55
n ,
66
56
{
67
57
...n ,
68
- type : 'jsx' ,
69
- value :
70
- '<div className="fusuma-screen">' +
71
- '<div>This view can capture the screen.<br />' +
72
- 'Click to get started.;)<br /><br />' +
73
- 'Note: This feature runs only in Presenter Mode.' +
74
- '</div>' +
75
- `<video id="fusuma-screen-${ videoId } " />` +
76
- '</div>' ,
58
+ ...transformScreenToJSX ( videoId ) ,
77
59
} ,
78
60
]
79
61
) ;
80
-
81
62
++ videoId ;
82
63
return ;
83
64
}
@@ -87,11 +68,7 @@ function mdxPlugin() {
87
68
if ( lang === 'chart' ) {
88
69
slide . push ( {
89
70
...n ,
90
- type : 'jsx' ,
91
- value : `<div className="mermaid" id="mermaid-${ mermaidId } " data-value="${ n . value . replace (
92
- / { 4 } / g,
93
- ''
94
- ) } " style={{ visibility: 'hidden'}}>${ n . value . replace ( / { 4 } / g, '' ) } </div>`,
71
+ ...transformChartToJSX ( mermaidId , value ) ,
95
72
} ) ;
96
73
97
74
++ mermaidId ;
@@ -119,7 +96,8 @@ function mdxPlugin() {
119
96
120
97
visit ( n , null , ( node ) => {
121
98
if ( node . type === 'image' ) {
122
- const { type, value } = transferMarkdownImageNodeToJSX ( node ) ;
99
+ const { type, value } = transformMarkdownImageNodeToJSX ( node ) ;
100
+
123
101
node . type = type ;
124
102
node . value = value ;
125
103
delete node . alt ;
@@ -145,9 +123,21 @@ function mdxPlugin() {
145
123
type : 'root' ,
146
124
children : slide ,
147
125
} ) ;
148
- const mdxJSX = toJSX ( hash ) ;
126
+ let mdxJSX = toJSX ( hash )
127
+ // TODO: refactor
128
+ . replace ( / { \s .+ \/ \* b l o c k - e n d \* \/ \s .+ } / gm, '</div>' ) ;
129
+
130
+ const matches = mdxJSX . matchAll ( / { \s .+ \/ \* b l o c k - s t a r t : ? ( .* ?) \* \/ \s .+ } / gm) ;
131
+
132
+ for ( const pos of matches ) {
133
+ const [ , className ] = pos ;
134
+ const div = className ? `<div className="${ className . trim ( ) } ">` : '<div>' ;
135
+ mdxJSX = mdxJSX . replace ( / { \s .+ \/ \* b l o c k - s t a r t : ? ( .* ?) \* \/ \s .+ } / m, div ) ;
136
+ }
137
+
149
138
// jsx variable is established, so we don't use babel/parser
150
139
const jsx = mdxJSX . match ( / < M D X L a y o u t .+ ?> ( [ \s \S ] * ) < \/ M D X L a y o u t > / m) ;
140
+
151
141
if ( jsx ) {
152
142
const template = `
153
143
(props) => (
0 commit comments