import ReactMarkdown, { defaultUrlTransform } from "react-markdown"; import remarkGfm from "remark-gfm"; import rehypeRaw from "rehype-raw"; import rehypeSanitize, { defaultSchema } from "rehype-sanitize"; import { rawUrl } from "@/lib/api"; // READMEs often embed HTML (centered headers, ,
). Render it, but // sanitized — repository content must never script against the site. const schema = { ...defaultSchema, attributes: { ...defaultSchema.attributes, "*": [...(defaultSchema.attributes?.["*"] ?? []), "align", "width", "height"], }, }; // Renders a repository README. Relative image/link targets are rewritten to // the backend's raw endpoint so screenshots in READMEs just work. export default function Markdown({ repo, refName, source, }: { repo: string; refName: string; source: string; }) { const transform = (url: string) => { if (/^(https?:|mailto:|#|data:)/i.test(url)) return defaultUrlTransform(url); return rawUrl(repo, refName, url.replace(/^\.\//, "")); }; return (
{source}
); }