(text: string)
| 233 | |
| 234 | // 改进的 Markdown 解析函数 |
| 235 | const parseMarkdown = (text: string): React.ReactNode[] => { |
| 236 | if (!text) return []; |
| 237 | |
| 238 | const lines = text.split('\n'); |
| 239 | const elements: React.ReactNode[] = []; |
| 240 | let currentCodeBlock = ''; |
| 241 | let inCodeBlock = false; |
| 242 | let codeLanguage = ''; |
| 243 | let inList = false; |
| 244 | let listItems: React.ReactNode[] = []; |
| 245 | |
| 246 | for (let i = 0; i < lines.length; i++) { |
| 247 | const line = lines[i]; |
| 248 | |
| 249 | // 检测代码块开始 |
| 250 | if (line.startsWith('```')) { |
| 251 | // 结束当前列表 |
| 252 | if (inList && listItems.length > 0) { |
| 253 | elements.push( |
| 254 | <ul key={`ul-${i}`} className="mb-4 pl-6 list-disc"> |
| 255 | {listItems} |
| 256 | </ul> |
| 257 | ); |
| 258 | listItems = []; |
| 259 | inList = false; |
| 260 | } |
| 261 | |
| 262 | if (!inCodeBlock) { |
| 263 | // 开始代码块 |
| 264 | inCodeBlock = true; |
| 265 | codeLanguage = line.slice(3).trim() || 'text'; |
| 266 | currentCodeBlock = ''; |
| 267 | } else { |
| 268 | // 结束代码块 |
| 269 | inCodeBlock = false; |
| 270 | if (currentCodeBlock.trim()) { |
| 271 | // 检测是否是 CodePen 格式 |
| 272 | const isCodePen = codeLanguage === 'codepen' || |
| 273 | currentCodeBlock.includes('<!-- CodePen Demo -->') || |
| 274 | currentCodeBlock.includes('<!-- HTML -->') || |
| 275 | currentCodeBlock.includes('<!-- CSS -->') || |
| 276 | currentCodeBlock.includes('<!-- JavaScript -->'); |
| 277 | |
| 278 | elements.push( |
| 279 | <CodeBlock key={`code-${i}`} language={isCodePen ? 'codepen' : codeLanguage}> |
| 280 | {currentCodeBlock.trim()} |
| 281 | </CodeBlock> |
| 282 | ); |
| 283 | } |
| 284 | currentCodeBlock = ''; |
| 285 | continue; |
| 286 | } |
| 287 | } else if (inCodeBlock) { |
| 288 | // 在代码块内 |
| 289 | currentCodeBlock += line + '\n'; |
| 290 | } else { |
| 291 | // 普通文本处理 |
| 292 | if (line.trim() === '') { |
no test coverage detected