1+ import { Highlight , Prism , PrismTheme } from 'prism-react-renderer' ;
2+ import { DarkCodeTheme , LightCodeTheme } from '../demo-block/code-theme' ;
3+ import { useTheme } from '@tiny-design/react' ;
4+
5+ // Register bash/shell grammar (not included in prism-react-renderer's default bundle)
6+ Prism . languages . bash = Prism . languages . shell = {
7+ comment : { pattern : / ( ^ | [ ^ " { \\ $ ] ) # .* / , lookbehind : true } ,
8+ 'shell-symbol' : { pattern : / ^ \$ (? = \s ) / m, alias : 'punctuation' } ,
9+ string : [
10+ { pattern : / \$ ' (?: [ ^ ' \\ ] | \\ [ \s \S ] ) * ' / , greedy : true } ,
11+ { pattern : / ( ^ | [ ^ \\ ] ) " (?: [ ^ " \\ ] | \\ .) * " / , lookbehind : true , greedy : true } ,
12+ { pattern : / ( ^ | [ ^ \\ ] ) ' [ ^ ' ] * ' / , lookbehind : true , greedy : true } ,
13+ ] ,
14+ variable : [ / \$ \{ [ ^ } ] + \} / , / \$ \( [ ^ ) ] + \) / , / \$ (?: \w + | [ ! # ? * @ _ ] ) / ] ,
15+ keyword : / \b (?: i f | t h e n | e l s e | e l i f | f i | f o r | d o | d o n e | c a s e | e s a c | w h i l e | u n t i l | f u n c t i o n | i n | s e l e c t | r e t u r n | e x i t ) \b / ,
16+ function :
17+ / \b (?: n p m | n p x | n o d e | y a r n | p n p m | b u n | g i t | c u r l | w g e t | m k d i r | c p | m v | r m | l s | c a t | g r e p | s e d | a w k | c h m o d | c h o w n | s u d o | a p t | b r e w | p i p | p y t h o n | r u b y | g o | c a r g o | m a k e | d o c k e r | c d | e c h o | e x p o r t | s o u r c e | t o u c h ) \b / ,
18+ 'flag' : { pattern : / ( ^ | \s ) - - ? [ \w - ] + / , lookbehind : true , alias : 'keyword' } ,
19+ number : / \b \d + \b / ,
20+ operator : / & & | \| \| | [ | ; ] / ,
21+ punctuation : / [ { } [ \] ( ) ] / ,
22+ } ;
23+
24+ export const HighlightedCode = ( { className, children } : { className : string , children : string } ) => {
25+ const { resolvedTheme } = useTheme ( ) ;
26+ const codeTheme = resolvedTheme === 'dark' ? DarkCodeTheme : LightCodeTheme ;
27+
28+ let language = 'markup' ;
29+ if ( className != null ) {
30+ language = className . replace ( / l a n g u a g e - / , '' ) ;
31+ }
32+
33+ const code = String ( children ?? '' ) . trim ( ) ;
34+
35+ return (
36+ < Highlight code = { code } language = { language } theme = { codeTheme as PrismTheme } >
37+ { ( { className : preClassName , style, tokens, getLineProps, getTokenProps } ) => (
38+ < pre className = { preClassName } style = { { ...style , padding : '10px 12px' } } >
39+ < code >
40+ { tokens . map ( ( line , i ) => {
41+ const { key : _lk , ...lineProps } = getLineProps ( { line } ) ;
42+ return (
43+ < div key = { i } { ...lineProps } >
44+ { line . map ( ( token , j ) => {
45+ const { key : _tk , ...tokenProps } = getTokenProps ( { token } ) ;
46+ return < span key = { j } { ...tokenProps } /> ;
47+ } ) }
48+ </ div >
49+ ) ;
50+ } ) }
51+ </ code >
52+ </ pre >
53+ ) }
54+ </ Highlight >
55+ ) ;
56+ } ;
0 commit comments