import rehypeRaw from "rehype-raw"; import rehypeSanitize from "rehype-sanitize"; import rehypeStringify from "rehype-stringify"; import remarkGfm from "remark-gfm"; import remarkParse from "remark-parse"; import remarkRehype from "remark-rehype"; import { unified } from "unified"; import { contentSchema } from "./sanitize-schema"; /** * GitHub-flavored Markdown -> sanitized HTML. * * Bodies are stored as HTML (see src/lib/html.ts), so this pipeline now * serves two jobs: converting markdown pasted into the editor and * converting the markdown-authored seed content at seed time. It shares * the same sanitize schema as the storage pipeline, so both routes admit * exactly the same HTML. */ const processor = unified() .use(remarkParse) .use(remarkGfm) .use(remarkRehype, { allowDangerousHtml: true }) .use(rehypeRaw) .use(rehypeSanitize, contentSchema) .use(rehypeStringify); export function renderMarkdown(markdown: string): string { return processor.processSync(markdown).toString(); }