diff --git a/frontend/components/design-system-components/MessageMarkdown.tsx b/frontend/components/design-system-components/MessageMarkdown.tsx index 341ef2f..0f8b1bb 100644 --- a/frontend/components/design-system-components/MessageMarkdown.tsx +++ b/frontend/components/design-system-components/MessageMarkdown.tsx @@ -280,6 +280,25 @@ const markdownComponents: any = { } } as const +// Normalize ordered list markers so that lines starting with "1) " are +// converted to the CommonMark style "1. ". This helps react-markdown parse +// them as ordered lists. We avoid transforming content inside fenced code blocks. +const normalizeOrderedListMarkers = (markdown: string) => { + let inCodeFence = false + const fenceRegex = /^\s*```/ + return markdown + .split('\n') + .map(line => { + if (fenceRegex.test(line)) { + inCodeFence = !inCodeFence + return line + } + if (inCodeFence) return line + return line.replace(/^(\s*)(\d+)\)\s+/, '$1$2. ') + }) + .join('\n') +} + const MessageMarkdown = ({ children, className, @@ -291,6 +310,7 @@ const MessageMarkdown = ({ allowHtml?: boolean textSize?: MarkdownTextSize }) => { + const normalizedChildren = normalizeOrderedListMarkers(children) return ( - {children} + {normalizedChildren} )