prism-react-renderer
シンタックスハイライトを適用させる方法はいくつかあるようですが、今回はprism-react-renderer
を使いました。
prism-react-rendererの導入
npm install prism-react-renderer
Gatybyの設定ファイルの記載は不要で、新規でファイルを作成します。
ここはコピペでも大丈夫です。
vsDark
の箇所はプラグインから好きなテーマを選択して下さい。
overflow:
は要素のボックスからはみ出た部分を扱うCSSのプロパティです。
今回はauto
のしている為、基本的には横スクロールが出る想定で記述しています。
// CodeBlock.jsimport React from "react";import Highlight, { defaultProps } from "prism-react-renderer";import theme from "prism-react-renderer/themes/vsDark";import Prism from "prism-react-renderer/prism";export default (props) => {const className = props.children.props.className || "";const matches = className.match(/language-(?<lang>.*)/);return (<Highlight{...defaultProps}code={props.children.props.children.trim()}language={matches && matches.groups && matches.groups.lang? matches.groups.lang: ""}theme={theme}>{({ className, style, tokens, getLineProps, getTokenProps }) => (<preclassName={className}style={{ ...style, padding: "20px", overflow: "auto" }}>{tokens.map((line, i) => (<div key={i} {...getLineProps({ line, key: i })}>{line.map((token, key) => (<span key={key} {...getTokenProps({ token, key })} />))}</div>))}</pre>)}</Highlight>);};
<MDXProvider>
で囲うことで、MDXコンテンツ内のタブのレンダリングを置き換えることが出来ます。
<pre>タグが
がCodeBlock
を置き換わるような感じです。
// Hogehoge.jsimport * as React from "react";import { MDXRenderer } from "gatsby-plugin-mdx";import { MDXProvider } from "@mdx-js/react";import CodeBlock from "../../components/CodeBlock";const components = {pre: CodeBlock,};const Hogehoge = ({ data }) => {const image = getImage(data.mdx.frontmatter.hero_image);const category = data.mdx.frontmatter.category;const pageTitle = data.mdx.frontmatter.title;return (<MDXProvider components={components}><MDXRenderer>{data.mdx.body}</MDXRenderer></MDXProvider>);};export default Hogehoge;
あとは各々のmdxファイルの記述についてはこちらのの”コードの挿入”を参考にしてみて下さい。