Gatsby + Tailwind CSS + prism-react-rendererでコードをシンタックスハイライトする<!-- -->|<!-- -->ツチノコの夢を見ていた

Gatsby + Tailwind CSS + prism-react-rendererでコードをシンタックスハイライトする

Posted: March 29, 2022

Gatsby logo
Image Credit: Gatsby

実装

いくつかのサイトを参考にしながら1 2 3、以下のような感じでスタイリングするといい感じになった。inlineのコードのスタイルは inlineCode で、コードブロックのスタイルは code で指定する4

mdx_components.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import React from 'react';
import Highlight, { defaultProps } from 'prism-react-renderer';
import dracula from "prism-react-renderer/themes/dracula"
const MDXComponents = {
inlineCode: props => <code className='leading-relaxed text-xs sm:text-sm lg:text-base py-0.5 px-1 bg-slate-200 text-slate-700 rounded-sm shadow-sm' {...props} />,
code: ({ children, className }) => {
// Pull the className
const language = className?.replace(/language-/, '') || ""
return (
<Highlight {...defaultProps}
code={children.trim()}
language={language}
theme={dracula}
>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<div
className={className + ' flex flex-row p-2 sm:p-4 md:p-6 text-sm sm:text-base mb-4 overflow-x-auto rounded-lg shadow-lg'}
style={{ ...style }}
>
<pre>
<div className='flex flex-row gap-1.5 sm:gap-3'>
<div className='flex flex-col items-end'>
{tokens.map((_, index) => {
return (
<span className='opacity-30'>{index + 1}</span>
)
})}
</div>
<div className='flex flex-col items-start'>
{tokens.map((line, index) => {
const lineProps = getLineProps({ line, key: index })
return (
<div key={index} {...lineProps}>
{line.map((token, key) => (
<span key={key}{...getTokenProps({ token, key })} />
))}
</div>
)
})}
</div>
</div>
</pre>
</div>
)}
</Highlight>
)
},
};
export default MDXComponents;