UNPKG

react-remarkify

Version:

A simple React.js utility to convert Markdown into React components.

28 lines (27 loc) 1.37 kB
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; }