import Link from "next/link"; import ReactMarkdown from "react-markdown"; import rehypeHighlight from "rehype-highlight"; import rehypeRaw from "rehype-raw"; import rehypeSlug from "rehype-slug"; import remarkGfm from "remark-gfm"; import WikiPage from "../../interfaces/WikiPage"; interface RenderMarkdownProps { children: string; page: WikiPage; } export default function RenderMarkdown({ children, page, }: RenderMarkdownProps) { return ( <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeRaw, rehypeHighlight, rehypeSlug]} components={{ a: ({ node, ...props }) => { // if the link is internal, reformat it; if it ends with a slash, do not apply this let href = props.href as string; if (!href.endsWith("/") && !href.startsWith("http")) { if (href.startsWith("/wiki/")) { href = `/wiki/${page.language}${href.slice(5)}`; } else { // if single relative href = `/wiki/${page.language}/${page.path}/${href}`; } } return ( <Link legacyBehavior href={href as string}> <a>{props.children ? props.children[0] : href}</a> </Link> ); }, img: ({ node, ...props }) => { // if image is internal (relative), prefix it with the current page's path let src = props.src as string; if (!src.startsWith("http") && !src.startsWith("/")) { src = `/img/wiki/${page.path}/${src}`; } return ( <div className="flex w-full flex-col items-center justify-center"> <img className="mb-2" src={src} alt={props.alt as string} title={props.title as string} /> <p> {props.title as string} </p> </div> ); }, }} > {children} </ReactMarkdown> ); }