@@ -3,12 +3,22 @@ import { useColorMode } from '@docusaurus/theme-common';
3
3
import { usePluginData } from '@docusaurus/useGlobalData' ;
4
4
import MDXPre from '@theme-original/MDXComponents/Pre' ;
5
5
import React from 'react' ;
6
+ import Tabs from '@theme/Tabs' ;
7
+ import TabItem from '@theme/TabItem' ;
8
+
9
+ const SUPPORTED_TABS = {
10
+ config : [
11
+ { value : 'static' , label : 'Static' , default : true } ,
12
+ { value : 'dynamic' , label : 'Dynamic' } ,
13
+ ] ,
14
+ } ;
6
15
7
16
export default function Pre ( {
8
17
children,
9
18
'data-name' : name ,
10
19
'data-snack' : snack ,
11
20
'data-dependencies' : deps ,
21
+ 'data-tabs' : tabs ,
12
22
'data-lang' : lang ,
13
23
...rest
14
24
} ) {
@@ -18,6 +28,62 @@ export default function Pre({
18
28
19
29
const child = React . Children . only ( children ) ;
20
30
31
+ // If we encounter tabs, we need to render 2 code blocks
32
+ if ( tabs && tabs in SUPPORTED_TABS ) {
33
+ return (
34
+ < Tabs groupId = "config" queryString = "config" >
35
+ { SUPPORTED_TABS [ tabs ] . map ( ( tab ) => {
36
+ const code = child . props . children ;
37
+
38
+ if ( typeof code !== 'string' ) {
39
+ throw new Error (
40
+ 'Code to display in tabs must be a string, but received ' +
41
+ typeof code
42
+ ) ;
43
+ }
44
+
45
+ const lines = code . split ( '\n' ) ;
46
+
47
+ let content = '' ;
48
+ let exclude = false ;
49
+ let indent ;
50
+
51
+ for ( const line of lines ) {
52
+ if ( line . trim ( ) . startsWith ( '// codeblock-tabs=' ) ) {
53
+ exclude = line . trim ( ) !== `// codeblock-tabs=${ tab . value } ` ;
54
+ } else if ( line . trim ( ) === '// codeblock-tabs-end' ) {
55
+ exclude = false ;
56
+ } else if ( ! exclude ) {
57
+ content += line + '\n' ;
58
+ }
59
+ }
60
+
61
+ return (
62
+ < TabItem
63
+ key = { tab . value }
64
+ value = { tab . value }
65
+ label = { tab . label }
66
+ default = { tab . default }
67
+ >
68
+ < Pre
69
+ { ...rest }
70
+ data-name = { name }
71
+ data-snack = { snack }
72
+ data-dependencies = { deps }
73
+ data-lang = { lang }
74
+ >
75
+ { React . cloneElement ( children , {
76
+ ...child . props ,
77
+ children : content . trim ( ) ,
78
+ } ) }
79
+ </ Pre >
80
+ </ TabItem >
81
+ ) ;
82
+ } ) }
83
+ </ Tabs >
84
+ ) ;
85
+ }
86
+
21
87
// Handle diffs with language
22
88
if ( child . props . className === 'language-diff' && lang ) {
23
89
const code = child . props . children ;
0 commit comments