O formato MDX nos permite escrever markdown ao mesmo tempo que escrevemos JSX.
Podemos usar
eimport
também, exemplo:exports
# Hello, *world*!Below is an example of JSX embedded in Markdown. <br /> **background color!**<div style={{ padding: '20px', backgroundColor: 'tomato' }}><h3>This is JSX</h3></div>
E o resultado:
Below is an example of JSX embedded in Markdown.
Background color!
Nosso foco aqui é ver como criar um componente que vai pegar nosso
e gerar o syntax highlight.code
Para mais informações de como configurar o MDX em seu projeto veja a documentação oficial https://mdxjs.com/getting-started
Vamos instalar o seguinte:
yarn add @mdx-js/react prism-react-renderer
Em seu arquivo
faça o seguinte:App.js
App.js
import { MDXProvider } from "@mdx-js/react";// Código omitidoconst components = {pre: (props) => <div {...props} />,code: (props) => <CodeBlock {...props} />, // <<<< CodeBlock que gera o syntax highlight};// Código omitido<MDXProvider components={components}><main {...props} /></MDXProvider>;// Código omitido
Exemplo completo App.
No código acima criamos um objeto chamado
, é nele que passamos quais componentes vamos querer alterar na renderização do MDX.components
Temos o
atribuído a tag html code, código completo CodeBlock:<CodeBlock />
CodeBlock:
import React from "react";import Highlight, { defaultProps } from "prism-react-renderer";import theme from "prism-react-renderer/themes/nightOwl";interface Props {children: string;}const CodeBlock = ({ children }: Props) => {return (<Highlight {...defaultProps} theme={theme} code={children} language="jsx">{({ className, style, tokens, getLineProps, getTokenProps }) => (<preclassName={className}style={{...style,padding: "20px",fontSize: "15px",overflowY: "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>);};export default CodeBlock;
Então, esse componente faz a mágica do syntax highlight, podemos atribuir um tema conforme foi feito aqui:
import theme from "prism-react-renderer/themes/nightOwl";
E no
atribuímos oHighlight
e otheme
que nesse caso ficou comolanguage
:jsx
<Highlight {...defaultProps} theme={theme} code={children} language="jsx">
Agora no nosso arquivo MDX, quando quisermos inserir códigos, basta fazer assim:
Mais informações sobre o syntax highlight https://mdxjs.com/guides/syntax-highlighting
Dúvidas? pode entrar em contato nos comentários que irei ajudar.