@@ -118,6 +118,25 @@ function renderMermaidInSlide() {
118118}
119119
120120
121+ function enableYouTubeJSAPI ( html : string ) : string {
122+ return html . replace ( / < i f r a m e [ ^ > ] * ?> / gi, ( iframeTag ) => {
123+ const srcMatch = iframeTag . match ( / s r c = [ " ' ] ( [ ^ " ' ] + ) [ " ' ] / i) ;
124+ if ( ! srcMatch ) return iframeTag ;
125+
126+ const src = srcMatch [ 1 ] ;
127+
128+ if ( ! src . includes ( "youtube.com/embed" ) ) return iframeTag ;
129+ if ( src . includes ( "enablejsapi=1" ) ) return iframeTag ;
130+
131+ const newSrc = src . includes ( "?" )
132+ ? `${ src } &enablejsapi=1`
133+ : `${ src } ?enablejsapi=1` ;
134+
135+ const updatedTag = iframeTag . replace ( src , newSrc ) ;
136+ return updatedTag ;
137+ } ) ;
138+ }
139+
121140function anchorBlank ( html : string ) : string {
122141 // return html.replace(/<a\b([^>]*?)>/g, '<a $1 target="_blank">')
123142 // return html.replace(/(?<!<sup>)<a\b([^>]*?)>/g, '<a $1 target="_blank">')
@@ -289,23 +308,18 @@ function appendRemark(option: SlideOptions) {
289308
290309 const body = document . querySelector ( ".center article" ) ?. innerHTML
291310
292- // sorry callback hell
293- const data =
294- anchorBlank (
295- unwrapSlideNote (
296- unwrapFootnotesSection (
297- handleFootnote (
298- handleIndex (
299- injectSeparators ( header + ( option . tags ? tags : "" ) + body , separator ) ,
300- separator ,
301- option ,
302- makeIndex ( )
303- ) ,
304- separator
305- ) ,
306- )
307- )
308- )
311+ const pipe = < T > ( value : T , ...fns : ( ( val : T ) => T ) [ ] ) : T =>
312+ fns . reduce ( ( acc , fn ) => fn ( acc ) , value ) ;
313+
314+ const data = pipe (
315+ injectSeparators ( header + ( option . tags ? tags : "" ) + body , separator ) ,
316+ ( d ) => handleIndex ( d , separator , option , makeIndex ( ) ) ,
317+ ( d ) => handleFootnote ( d , separator ) ,
318+ unwrapFootnotesSection ,
319+ unwrapSlideNote ,
320+ enableYouTubeJSAPI ,
321+ anchorBlank
322+ ) ;
309323
310324 document . body . innerHTML = ""
311325
@@ -332,8 +346,10 @@ function appendRemark(option: SlideOptions) {
332346function paramOption ( defaultOption : SlideOptions ) {
333347 const params = new URLSearchParams ( window . location . search )
334348
335- const getBool = ( key : string , fallback = false ) =>
336- params . has ( key ) ? params . get ( key ) ?. toLowerCase ( ) === "true" : fallback
349+ const getBool = ( key : string , fallback = false ) => {
350+ const value = params . get ( key ) ?. toLowerCase ( ) ;
351+ return value === "true" ? true : value === "false" ? false : fallback ;
352+ } ;
337353
338354 type Ratio = SlideOptions [ "ratio" ]
339355 const validRatios : Ratio [ ] = [ "4:3" , "16:9" ] ;
0 commit comments