@@ -21,18 +21,35 @@ function mdxPlugin() {
21
21
let mermaidId = 1 ;
22
22
let isFragmentArea = false ;
23
23
let fragmentSteps = 0 ;
24
+ let fragmentId = 0 ;
25
+ let hasFragments = false ;
26
+
27
+ function formatSlidesTimeline ( fragmentSteps , fragmentId ) {
28
+ if ( fragmentSteps === 0 ) {
29
+ return [ 0 ] ;
30
+ } else {
31
+ hasFragments = true ;
32
+ return [ [ ...Array ( fragmentSteps ) ] . fill ( fragmentId ) ] ;
33
+ }
34
+ }
24
35
25
36
// TODO: refactor using visit
26
37
tree . children . forEach ( ( n , i ) => {
27
38
const { type, value, lang, meta } = n ;
28
39
29
40
// move to a new slide
30
41
if ( type === 'thematicBreak' ) {
31
- slides . push ( { slide, props, background, fragmentSteps } ) ;
42
+ slides . push ( {
43
+ slide,
44
+ props,
45
+ background,
46
+ fragmentSteps : formatSlidesTimeline ( fragmentSteps , fragmentId ) ,
47
+ } ) ;
32
48
slide = [ ] ;
33
49
props = { } ;
34
50
background = 0 ; // why 0? because null, undefined, '' are omitted at client side
35
51
fragmentSteps = 0 ;
52
+ fragmentId = 0 ;
36
53
isFragmentArea = false ;
37
54
return ;
38
55
}
@@ -69,10 +86,11 @@ function mdxPlugin() {
69
86
return ;
70
87
}
71
88
if ( prefix === 'fragments-start' ) {
89
+ fragmentId = Math . random ( ) ;
72
90
slide . push ( {
73
91
...n ,
74
92
type : 'jsx' ,
75
- value : ' <Client.Fragments>' ,
93
+ value : ` <Client.Fragments id={ ${ fragmentId } }>` ,
76
94
} ) ;
77
95
isFragmentArea = true ;
78
96
return ;
@@ -180,7 +198,12 @@ function mdxPlugin() {
180
198
} ) ;
181
199
182
200
// push last slide
183
- slides . push ( { slide, props, background, fragmentSteps } ) ;
201
+ slides . push ( {
202
+ slide,
203
+ props,
204
+ background,
205
+ fragmentSteps : formatSlidesTimeline ( fragmentSteps , fragmentId ) ,
206
+ } ) ;
184
207
185
208
const res = {
186
209
jsx : [ ] ,
@@ -212,7 +235,7 @@ function mdxPlugin() {
212
235
res . jsx . push ( template ) ;
213
236
res . fusumaProps . push ( fusumaProps ) ;
214
237
res . background . push ( background ) ;
215
- res . fragmentSteps . push ( fragmentSteps ) ;
238
+ res . fragmentSteps . push ( ... fragmentSteps ) ;
216
239
}
217
240
} ) ;
218
241
@@ -224,12 +247,17 @@ function mdxPlugin() {
224
247
value : `
225
248
import React from 'react';
226
249
import { mdx } from '@mdx-js/react';
250
+ ${
251
+ hasFragments &&
252
+ `
227
253
// don't import as named to avoid using makeShortcode by mdx
228
254
import * as Client from '@fusuma/client';
255
+ `
256
+ }
229
257
230
258
export const slides = [${ res . jsx . join ( ',\n' ) } ];
231
259
export const backgrounds = [${ res . background . join ( ',\n' ) } ];
232
- export const fragmentSteps = [ ${ res . fragmentSteps . join ( ',\n' ) } ] ;
260
+ export const fragmentSteps = ${ JSON . stringify ( res . fragmentSteps ) } ;
233
261
export const fusumaProps = [${ res . fusumaProps . join ( ',\n' ) } ];` ,
234
262
} ) ;
235
263
} ;
0 commit comments