How toAdd syntax highlight to Markdoc using Prism.js
If you're using Markdoc like me, you may want to add syntax highlight, this is how I added it on my blog
First install the Prism.js package.
npm add prismjs
npm add -D @types/prismjs
Now, let create a component called Fence
that will receive any code block and call Prism.
app/components/fence.tsx import Prism from "prismjs"; // Load the grammars you want to support import "prismjs/components/prism-cshtml"; import "prismjs/components/prism-css"; import "prismjs/components/prism-javascript"; import "prismjs/components/prism-json"; import "prismjs/components/prism-jsx"; import "prismjs/components/prism-typescript"; type FenceProps = { children: string; language: string; }; export function Fence({ children, language }: FenceProps) { let content = Prism.highlight(children, Prism.languages[language], language); return ( <pre className={`language-${language}`} dangerouslySetInnerHTML={{ __html: content }} /> ); } export const fence = { render: "Fence", attributes: { language: { type: String } } };
Now, go to where you call the Markdoc.transform
function and pass your fence
object.
app/modules/md.server.ts import { parse, transform } from "@markdoc/markdoc"; // Here import your `fence` object import { fence } from "~/components/fence"; export function parse(content: string) { return transform(parse(content), { nodes: { fence } }) }
And then use the Fence
component where you render the React components.
app/components/markdown.tsx import type { RenderableTreeNodes } from "@markdoc/markdoc"; import { renderers } from "@markdoc/markdoc"; import * as React from "react"; // Here import your component import { Fence } from "~/components/fence"; type Props = { content: RenderableTreeNodes }; export function MarkdownView({ content }: Props) { return <>{renderers.react(content, React, { components: { Fence } })}</>; }
And that's it.