M0-M11 狩夜人笔记初始实现:11里程碑+86测试

This commit is contained in:
hunter-dev
2026-08-24 20:35:22 +08:00
commit 3ebd33536b
106 changed files with 10490 additions and 0 deletions
+35
View File
@@ -0,0 +1,35 @@
# 往返 fixture 集(Round-trip Corpus)
> 用途:狩夜人笔记编辑器 Markdown 往返回归基线。每个 .md 是一条输入语料;断言策略见《去风险验证任务书》A.5。
> 判据:mdast 等价(输入 md 与往返结果 md 各自 parse 成 mdast 后 deep-equal),非字节相等。
## 文件清单与期望
| 文件 | 类别 | 期望 |
|---|---|---|
| emphasis-nested.md | 嵌套强调 | mdast-equal |
| escaping.md | 反斜杠转义 | mdast-equal |
| html.md | 裸 HTML | fenced-preserve(spike 决断) |
| whitespace.md | 空白/空行/硬换行 | mdast-equal |
| tables.md | GFM 表格与对齐 | mdast-equal |
| codeblock.md | 代码块/嵌套围栏/语言 | mdast-equal |
| tasklist.md | GFM 任务列表 | mdast-equal |
| math.md | 数学公式 inline/block | mdast-equal(依赖 remark-math) |
| links.md | 链接 inline/reference/autolink | mdast-equal |
| images.md | 图片与图片链接 | mdast-equal |
| blockquote.md | 嵌套引用 | mdast-equal |
| lists-nested.md | 有序/无序嵌套、松紧 | mdast-equal |
| headings.md | 一至六级标题 | mdast-equal |
| breaks.md | 硬换行 | mdast-equal |
| thematic-break.md | 分割线 | mdast-equal |
| combined.md | 综合混合文档 | mdast-equal |
## 扩展规则
- 凡报告的往返丢字 bug,先转成新 fixture 再修,回归集只增不减。
- 新增 fixture 在本表追加一行,并标注期望。
## 运行方式(spike/M2 落地后)
- 框架:Vitest;遍历本目录所有 .md(排除 README),逐条 md→PM→md 后按 mdast 等价断言。
- mdast 解析统一用:unified + remark-parse + remark-gfm + remark-math。
+12
View File
@@ -0,0 +1,12 @@
# 引用
> 一层引用
> > 二层嵌套引用
> 引用内含列表:
> - 项一
> - 项二
> 引用内含代码:
> `inline code`
+7
View File
@@ -0,0 +1,7 @@
# 硬换行
双空格硬换行第一行
第二行。
反斜杠硬换行第一行\
第二行。
+21
View File
@@ -0,0 +1,21 @@
# 代码块
```js
const x = 1; // 行内注释
```
无语言代码块:
```
plain text
```
嵌套围栏:外层 4 反引号包裹内层 3 反引号:
````
```js
inner code
```
````
行内代码 `含 * 星号不解析`。
+29
View File
@@ -0,0 +1,29 @@
# 综合文档
一段含 **粗**、*斜*、`code` 与 [链接](https://example.com) 的引言。
## 列表与任务
- [x] 项一
- 子项
- [ ] 项二
## 代码
```ts
function add(a: number, b: number) {
return a + b;
}
```
## 表格
| A | B |
|---|---|
| 1 | 2 |
> 引用收尾
---
$$E=mc^2$$
+13
View File
@@ -0,0 +1,13 @@
# 嵌套强调
**外层粗体 *内层斜体* 收尾**
***粗斜合一***
*斜体中含 **粗体** 嵌套*
**粗体中含 *斜体* 嵌套**
两端星号与下划线混用:_下划线斜体_ 与 *星号斜体*。
不配对的孤立星号 * 不影响其余文本。
+13
View File
@@ -0,0 +1,13 @@
# 反斜杠转义
这里 \*不是斜体\* 而是 literal 星号。
这里 \`不是代码\` 而是 literal 反引号。
反斜杠本身:\\ 输出一个反斜杠。
反斜杠转义井号:\# 不是标题。
反斜杠转义句点:1\. 不是有序列表。
反斜杠转义管道:a \| b 在表格外应保留。
+15
View File
@@ -0,0 +1,15 @@
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
带尾随井号的标题 ##
> 仅 ATX 标题;Setext 是否支持由 spike 决断。
+9
View File
@@ -0,0 +1,9 @@
# 裸 HTML 处置
这是一段含 <strong>HTML</strong> 的文本。
<div>块级 HTML</div>
<!-- 注释 -->
> 期望:schema 禁用裸 HTML;spike 决断为转义为文本、代码围栏保留或透传。本 fixture 用于锁定该决断的往返行为。
+7
View File
@@ -0,0 +1,7 @@
# 图片
![alt 文本](https://example.com/x.png "标题")
无 title 图片 ![alt](https://example.com/y.png)
图片链接 [![alt](https://example.com/thumb.png)](https://example.com/full)
+11
View File
@@ -0,0 +1,11 @@
# 链接
行内链接 [文本](https://example.com "标题")。
无 title 链接 [文本](https://example.com)。
引用链接 [文本][ref] 与定义 [ref]: https://example.com "标题"。
自动链接 <https://example.com>。
含特殊字符的链接 [a/b](https://example.com/a/b)。
+18
View File
@@ -0,0 +1,18 @@
# 嵌套列表
- 无序一
- 子项 a
- 孙项 i
- 子项 b
- 无序二
1. 有序一
1. 子序 1
2. 子序 2
2. 有序二
松散列表(项间空行):
- 项一
- 项二
+11
View File
@@ -0,0 +1,11 @@
# 数学公式
行内公式 $E = mc^2$ 嵌于文本。
块级公式:
$$
\int_0^1 x^2 \, dx = \frac{1}{3}
$$
> 依赖 remark-math;spike 确认序列化保留 $ 与 $$ 围栏。
+13
View File
@@ -0,0 +1,13 @@
# GFM 表格
| 左对齐 | 居中 | 右对齐 |
|:---|:---:|---:|
| a | b | c |
| d | e | f |
含特殊字符的单元格:
| 符号 | 值 |
|---|---|
| pipe \| 转义 | 1 |
| *斜* 单元 | 2 |
+10
View File
@@ -0,0 +1,10 @@
# 任务列表
- [x] 已完成项
- [ ] 未完成项
- [ ] 另一个未完成
有序任务:
1. [x] 第一
2. [ ] 第二
+7
View File
@@ -0,0 +1,7 @@
# 分割线
---
***
___
+12
View File
@@ -0,0 +1,12 @@
# 空白与空行
一段文本。
连续多个空行后的段落应保留为单一段落分隔。
尾部带两个空格的行
应为硬换行延续到本行。
行首缩进三空格不影响段落。