import { describe, expect, it } from 'vitest' import { renderMarkdown, renderMarkdownDiff } from './markdown' describe('renderMarkdown', () => { it('一行文字是一个段落;段内换行是软换行,空行分段', () => { expect(renderMarkdown('读配置。')).toBe('

读配置。

\n') expect(renderMarkdown('第一行\n接着写\n\n第二段')).toBe('

第一行\n接着写

\n

第二段

\n') }) it('行内代码(含双反引号)、强调、列表、代码块、标题、引用、表格', () => { expect(renderMarkdown('先过 :func:`normalize_phone`,打印 ``user`` 时 **脱敏**')).toBe( '

先过 :func:normalize_phone,打印 user 时 脱敏

\n', ) expect(renderMarkdown('- 甲\n- 乙')).toBe('\n') expect(renderMarkdown('```ts\nload(\'a\')\n```')).toBe('
load(\'a\')\n
\n') expect(renderMarkdown('例子:\n\n f(1)')).toBe('

例子:

\n
f(1)\n
\n') expect(renderMarkdown('# 标题')).toBe('

标题

\n') expect(renderMarkdown('> 引用')).toBe('
\n

引用

\n
\n') expect(renderMarkdown('| a | b |\n| - | - |\n| 1 | 2 |')).toContain('') }) it('源码里的 HTML 当文字显示', () => { expect(renderMarkdown('用 mask')).toBe( '

用 <b>mask</b> <script>alert(1)</script>

\n', ) expect(renderMarkdown('
块
')).toBe('

<div onclick="x()">块</div>

\n') }) it('带协议的网址、邮箱自动成链接;不带协议的文件名不算', () => { expect(renderMarkdown('见 https://example.com/phone')).toBe('

见 https://example.com/phone

\n') expect(renderMarkdown('[文档](http://example.com)')).toBe('

文档

\n') expect(renderMarkdown('找 dev@example.com')).toContain('') expect(renderMarkdown('改 sample.py 和 README.md')).toBe('

改 sample.py 和 README.md

\n') }) it('链接只认 http / https / mailto,别的照原文显示;图片不渲染', () => { expect(renderMarkdown('[点](javascript:alert(1))')).not.toContain(' { expect(renderMarkdown('[文档](https://example.com "接口说明")')).toBe('

文档

\n') expect(renderMarkdown('[文档](https://example.com "")')).toBe('

文档

\n') }) }) describe('renderMarkdownDiff', () => { it('照常排版,新加的字包进 、删掉的包进 ', () => { expect(renderMarkdownDiff([{ text: '放锁' }, { text: '前', change: 'del' }, { text: '都', change: 'add' }, { text: '必须比对 `token`' }])) .toBe('

放锁前都必须比对 token

\n') }) it('跨行的一截逐行包,新加的列表项留住列表记号', () => { expect(renderMarkdownDiff([{ text: '- a\n' }, { text: '- b\n- c', change: 'add' }])) .toBe('\n') }) it('行中间的一截不把前面的字当块记号', () => { expect(renderMarkdownDiff([{ text: '共 ' }, { text: '# 3', change: 'add' }])).toBe('

共 # 3

\n') }) })