If you’re working with Next.js and need to parse Markdown to display it on a page, this guide is for you. In this example, we’ll be using the marked, dompurify, and jsdom libraries to accomplish this task.

To begin, let’s assume you have a field containing markdown content that you want to display on a Next.js page. Here’s an example of how you can render an item’s description using these libraries on a Next.js dynamic page.

First, make sure you have the necessary dependencies installed. You can do this using the following command:

npm install marked dompurify jsdom

Next, let’s take a look at the code in the example Next.js dynamic page:

import { useState, useEffect } from 'react';
import Head from 'next/head';
import Link from 'next/link';
import { useRouter } from 'next/router';
import { getJob, getJobs } from 'lib/data.js';
import prisma from 'lib/prisma';
import marked from 'marked';
import createDOMPurify from 'dompurify';
import { JSDOM } from 'jsdom';

export default function Item({ item }) {
  return <p>{item.description}</p>;
}

export async function getStaticPaths() {
  const items = await getItems(prisma);

  return {
    paths: items.map((job) => ({
      params: {
        id: String(item.id),
      },
    })),
    fallback: false,
  };
}

export async function getStaticProps({ params }) {
  const id = String(params.id);
  const item = await getItem(prisma, id); // unrelated

  const window = new JSDOM('').window;
  const DOMPurify = createDOMPurify(window);
  item.description = DOMPurify.sanitize(marked(item.description));

  return { props: { item } };
}

In this code, we’re using the getStaticProps function to fetch the item’s data and sanitize the Markdown content. First, we retrieve the item’s description from our data source, and then we create a new window using JSDOM from the jsdom library.

After that, we initialize DOMPurify using createDOMPurify and pass it the window we created earlier. This step is necessary because DOMPurify assumes a Node.js environment when running server-side. Finally, we use DOMPurify.sanitize to sanitize the Markdown content and assign the sanitized content back to the item.description variable.

That’s it! Now you can use the sanitized Markdown content to render it on your page.

Tags: Next.js, Markdown parsing, marked, dompurify, jsdom