feat: pure markdown

This commit is contained in:
Joel
2026-03-05 17:29:17 +08:00
parent 10bb786341
commit 8e3a8ef908
2 changed files with 22 additions and 2 deletions

View File

@ -7,7 +7,10 @@ export const withIconCardListPropsSchema = z.object(commonSchema).strict()
export const withIconCardItemPropsSchema = z.object({
...commonSchema,
icon: z.string().trim(),
icon: z.string().trim().url().refine(
value => /^https?:\/\//i.test(value),
'icon must be a http/https URL',
),
}).strict()
export const directivePropsSchemas = {

View File

@ -1,4 +1,5 @@
import type { Components } from 'react-markdown'
import DOMPurify from 'dompurify'
import ReactMarkdown from 'react-markdown'
import remarkDirective from 'remark-directive'
import { visit } from 'unist-util-visit'
@ -169,11 +170,27 @@ type MarkdownWithDirectiveProps = {
markdown: string
}
function sanitizeMarkdownInput(markdown: string): string {
if (!markdown)
return ''
if (typeof DOMPurify.sanitize === 'function') {
return DOMPurify.sanitize(markdown, {
ALLOWED_ATTR: [],
ALLOWED_TAGS: [],
})
}
return markdown
}
export function MarkdownWithDirective({ markdown }: MarkdownWithDirectiveProps) {
const normalizedMarkdown = normalizeDirectiveAttributeBlocks(markdown)
const sanitizedMarkdown = sanitizeMarkdownInput(markdown)
const normalizedMarkdown = normalizeDirectiveAttributeBlocks(sanitizedMarkdown)
return (
<ReactMarkdown
skipHtml
remarkPlugins={[remarkDirective, directivePlugin]}
components={directiveComponents}
>