From 12040be8682bce20379ce04d88db091cc4736161 Mon Sep 17 00:00:00 2001 From: 22605 <22605@utpcb.com> Date: Thu, 19 Mar 2026 11:24:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(markdown):=20=E6=94=AF=E6=8C=81=20Markdown?= =?UTF-8?q?=20=E8=A1=A8=E6=A0=BC=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 markdown.js 中添加表格检测和渲染逻辑 - 支持标准格式 (| cell |) 和简化格式 (cell | cell) - 添加 renderTable() 辅助函数处理表格解析 - 在 chat.css 中添加美观的表格样式 - 表头高亮、斑马纹、悬停效果 --- src/lib/markdown.js | 94 +++++++++++++++++++++++++++++++++++++++++++++ src/style/chat.css | 28 ++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/src/lib/markdown.js b/src/lib/markdown.js index 25e1cb0..09eaa38 100644 --- a/src/lib/markdown.js +++ b/src/lib/markdown.js @@ -89,6 +89,8 @@ export function renderMarkdown(text) { const result = [] let inList = false let listType = '' + let inTable = false + let tableRows = [] for (let i = 0; i < lines.length; i++) { let line = lines[i] @@ -100,6 +102,38 @@ export function renderMarkdown(text) { continue } + // 表格检测:表头分隔行 (|---|...|) + const isTableSeparator = /^\s*\|[\s\-:|]+\|\s*$/.test(line) || + /^\s*[\-:]+(\s*\|\s*[\-:]+)+\s*$/.test(line) + + // 检测是否可能是表格行 + const isTableRow = /^\s*\|.*\|\s*$/.test(line) || + /^\s*[^\|]+\s*\|\s*[^\|]+/.test(line) + + // 如果在表格中,继续收集行 + if (inTable) { + if (isTableRow && line.trim() !== '') { + tableRows.push(line) + continue + } else { + // 表格结束,渲染表格 + result.push(renderTable(tableRows)) + inTable = false + tableRows = [] + } + } + + // 检测表格开始:当前行是表格行,且下一行是分隔行 + if (!inTable && isTableRow && i + 1 < lines.length) { + const nextLine = lines[i + 1] + if (/^\s*\|[\s\-:|]+\|\s*$/.test(nextLine) || + /^\s*[\-:]+(\s*\|\s*[\-:]+)+\s*$/.test(nextLine)) { + inTable = true + tableRows.push(line) + continue + } + } + // 标题 const headingMatch = line.match(/^(#{1,3})\s+(.+)$/) if (headingMatch) { @@ -138,9 +172,69 @@ export function renderMarkdown(text) { } if (inList) result.push(`${listType}>`) + // 处理剩余的表格 + if (inTable && tableRows.length > 0) { + result.push(renderTable(tableRows)) + } return result.join('\n') } +/** + * 渲染 Markdown 表格 + * @param {string[]} rows - 表格行数组 + * @returns {string} HTML 表格 + */ +function renderTable(rows) { + if (!rows || rows.length < 2) return '' + + const table = ['