@@ -80,12 +80,52 @@ export default function Pre({
8080 'data-snack' : snack ,
8181 'data-version' : version ,
8282 'data-dependencies' : deps ,
83+ 'data-lang' : lang ,
8384 ...rest
8485} ) {
8586 const { colorMode } = useColorMode ( ) ;
87+ const child = React . Children . only ( children ) ;
8688
89+ // Handle diffs with language
90+ if ( child . props . className === 'language-diff' && lang ) {
91+ const code = child . props . children ;
92+
93+ if ( typeof code !== 'string' ) {
94+ throw new Error (
95+ 'Diff code must be a string, but received ' + typeof code
96+ ) ;
97+ }
98+
99+ // Replace + and - with magic comments
100+ // Need to add following in docusaurus.config.js
101+ // themeConfig.prims.magicComments: [
102+ // { className: 'code-block-diff-add-line', line: 'diff-add' },
103+ // { className: 'code-block-diff-remove-line', line: 'diff-remove' },
104+ // ],
105+ const content = code
106+ . split ( '\n' )
107+ . map ( ( line ) => {
108+ if ( line . startsWith ( '+ ' ) ) {
109+ return `// diff-add\n${ line . replace ( / ^ \+ / , '' ) } ` ;
110+ } else if ( line . startsWith ( '- ' ) ) {
111+ return `// diff-remove\n${ line . replace ( / ^ - / , '' ) } ` ;
112+ }
113+
114+ return line ;
115+ } )
116+ . join ( '\n' ) ;
117+
118+ children = React . cloneElement ( child , {
119+ className : `language-${ lang } ` ,
120+ children : content ,
121+ } ) ;
122+
123+ return < MDXPre { ...rest } > { children } </ MDXPre > ;
124+ }
125+
126+ // Handle snack demos
87127 if ( snack ) {
88- const code = React . Children . only ( children ) . props . children ;
128+ const code = child . props . children ;
89129
90130 if ( typeof code !== 'string' ) {
91131 throw new Error (
@@ -228,8 +268,8 @@ export default function Pre({
228268 }
229269 }
230270
231- children = React . Children . map ( children , ( child ) =>
232- React . cloneElement ( child , { children : content } )
271+ children = React . Children . map ( children , ( c ) =>
272+ React . cloneElement ( c , { children : content } )
233273 ) ;
234274 }
235275
0 commit comments