markdown-table.js 1.2 KB

1234567891011121314151617181920212223242526
  1. /**
  2. * 序列化 Markdown 表格(与 parsers/markdown-table.js 配对,转义读写对称)。
  3. * 单元格内 `|` 转义为 `\|`(R11:别名「刀疤|老王」不再被切丢后半)、`\` 转义为 `\\`、
  4. * 换行替换为空格(表格单元格不容纳换行)。
  5. * 行对象里表头之外的额外列(作者手加的列)按首次出现序追加在尾部,全表重写不丢列(A11)。
  6. * @param {string[]} headers 表头
  7. * @param {object[]} rows 行对象数组(按 header 取值,缺失补空)
  8. * @returns {string} Markdown 表格文本(含尾换行)
  9. */
  10. export function serializeMarkdownTable(headers, rows) {
  11. const allHeaders = [...headers]
  12. for (const r of rows) {
  13. for (const k of Object.keys(r)) {
  14. if (!allHeaders.includes(k)) allHeaders.push(k)
  15. }
  16. }
  17. const cell = (v) =>
  18. String(v ?? '')
  19. .replace(/\\/g, '\\\\')
  20. .replace(/\|/g, '\\|')
  21. .replace(/\r?\n/g, ' ')
  22. const head = `| ${allHeaders.map(cell).join(' | ')} |`
  23. const sep = `| ${allHeaders.map(() => '---').join(' | ')} |`
  24. const body = rows.map((r) => `| ${allHeaders.map((h) => cell(r[h])).join(' | ')} |`)
  25. return [head, sep, ...body].join('\n') + '\n'
  26. }