react-remarkify
Version:
A simple React.js utility to convert Markdown into React components.
28 lines (27 loc) • 1.37 kB
JavaScript
import { toJsxRuntime } from "hast-util-to-jsx-runtime";
import { useMemo } from "react";
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
import rehypeReact from "rehype-react";
import remarkParse from "remark-parse";
import remarkToRehype from "remark-rehype";
import { unified } from "unified";
import { tryCatch } from "./utils.js";
export function useRemark({ markdown, rehypePlugins = [], rehypeReactOptions, remarkParseOptions, remarkPlugins = [], remarkToRehypeOptions, components, onError = console.error }) {
const processor = useMemo(() => unified()
.use(remarkParse, remarkParseOptions)
.use(remarkPlugins)
.use(remarkToRehype, remarkToRehypeOptions)
.use(rehypePlugins)
.use(rehypeReact, Object.assign(Object.assign({}, rehypeReactOptions), { Fragment, jsx, jsxs })), []);
const reactContent = useMemo(() => {
const { success, data, error } = tryCatch(() => {
const file = processor.processSync(markdown);
return (components ? processor.runSync(processor.parse(file), file) : file.result);
});
if (success)
return components ? toJsxRuntime(data, { Fragment, components, ignoreInvalidStyle: true, jsx, jsxs, passKeys: true, passNode: true }) : data;
onError(error);
return null;
}, [markdown]);
return reactContent;
}