Bonus - Inline Code Blocks

1 min read Tweet this post
Architecture Blocks
Photo By Desmond Marshall

Introduction

A little bonus… have you noticed all the nicely formtted inline code blocks? Like this one: <MDXProvider />?

Well that’s all done with prism-react-renderer and MDX as well!

Here’s how.

Add an inlineCode option to the components in our <MDXProvider />

src/components/MDXProvider.js
import React from "react";
import { MDXProvider as BaseMDXProvider } from "@mdx-js/react";
import InlineCode from "./InlineCode";

// Simplified for brevity ...

const Code = ({ children }) => {
  if (!children) return null;

  let lang = null;
  let inlineCode = children;

  // We'll be using double underscores to set our language for
  // inline code blocks.
  const RE = /__/;

  if (RE.test(children)) {
    const match = children.split("__");
    lang = match[0];
    inlineCode = match[1];
  }

  return <InlineCode lang={lang}>{inlineCode}</InlineCode>;
};

const components = {
  inlineCode: Code,
};

function MDXProvider({ children }) {
  return <BaseMDXProvider components={components}>{children}</BaseMDXProvider>;
}

export default MDXProvider;

Then create your <InlineCode /> component.

src/components/InlineCode.js
import React from "react";
import Highlight, { defaultProps } from "prism-react-renderer";

function InlineCode({ lang, children }) {
  const theme = useColorModeValue({ dark: darkTheme, light: lightTheme });

  return (
    <Highlight {...defaultProps} code={children} language={lang} theme={theme}>
      {({ class, style, tokens, getLineProps, getTokenProps }) => (
        <code class={`inline-code ${class}`} style={style}>
          {tokens.map((line, i) => (
            <span {...getLineProps({ line, key: i })}>
              {line.map((token, key) => (
                <span {...getTokenProps({ token, key })} />
              ))}
            </span>
          ))}
        </Code>
      )}
    </Highlight>
  );
}

export default InlineCode;

And finally the styles to make it pretty 😍

src/components/InlineCode.css
.inline-code {
  font-size: 0.875rem;
  line-height: 1.25rem;
  white-space: nowrap;
  border-radius: 0.25rem;
  padding: 0.25rem 0.5rem;
}

There you have it! Now you can write blocks inline with single backticks like this —

`css__font-size: 1rem;`

— or this —

`jsx__<MDXProvider />`

which will render this font-size: 1rem; and this <MDXProvider />.

Hopefully you now have beautiful, rich, inline and multi-line code blocks. Drop a comment if this helped you out and send me a picture of your blocks on twitter @wray_tw!

gatsby react mdx