Syntax highlighting for fenced code blocks in Gatsby MDX
May 1, 2020
Ziel
Syntax Highlighting fuer MDX Code Blocks mit Prism.
Setup
code
npm install prism-react-renderer
gatsby-browser.js:
code
import React from "react";
import { MDXProvider } from "@mdx-js/react";
import Highlight, { defaultProps } from "prism-react-renderer";
import github from "prism-react-renderer/themes/github";
const components = {
pre: (props) => {
const className = props.children.props.className || "";
const matches = className.match(/language-(?<lang>.*)/);
const language = matches?.groups?.lang || "";
return (
<Highlight
{...defaultProps}
code={props.children.props.children}
language={language}
theme={github}
>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<pre className={className} style={style}>
{tokens.map((line, i) => (
<div key={i} {...getLineProps({ line })}>
{line.map((token, key) => (
<span key={key} {...getTokenProps({ token })} />
))}
</div>
))}
</pre>
)}
</Highlight>
);
},
};
export const wrapRootElement = ({ element }) => (
<MDXProvider components={components}>{element}</MDXProvider>
);
Weitere Sprachen
code
npm i prismjs
code
import Prism from "prism-react-renderer/prism";
(typeof global !== "undefined" ? global : window).Prism = Prism;
require("prismjs/components/prism-csharp");