コードブロックへのシンタックスハイライトの追加 next-mdx-remote
シンタックスハイライトを追加したい
next-mdx-remoteで作成したページではコードブロックのシンタックスハイライトが機能しません。本記事ではシンタックスハイライトを有効にするための方法について紹介します。
方法概要
- next-mdx-remoteのコンポーネント拡張を利用する
- react-syntax-highlighterを使う
方法
-
react-syntax-highlighterをインストール
Copied!!npm install react-syntax-highlighter --save
-
カスタムコンポーネントを実装する
components/codeblock.jsCopied!!import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { atomDark } from "react-syntax-highlighter/dist/cjs/styles/prism"; const CodeBlock = ({ className, children = "" }) => { // コードブロックの各要素を設定 const match = /language-(\w+)(:?.*)/.exec(className || ""); const language = match && match[1] ? match[1] : ""; const code = String(children).replace(/\n$/, ""); return ( <> <SyntaxHighlighter language={language} style={atomDark} className="code-block" > {code} </SyntaxHighlighter> <style jsx global>{` .code-block { border-radius: 0.3rem !important; padding: 1.5rem !important; } `}</style> </> ); }; export default CodeBlock
-
MDXRemoteのコンポーネントに追加する
pages/hoge.jsCopied!!import CodeBlock from '../../components/codeblock'; const components = { code: (props) => ( <CodeBlock {...props} /> ), }; export default function HogePage({ source }){ return ( <MDXRemote {...source} components={components}> ) }