md2ui 1.0.18 → 1.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +51 -58
  2. package/bin/build.js +95 -9
  3. package/bin/md2ui.js +102 -13
  4. package/package.json +24 -10
  5. package/public/docs/00-/345/277/253/351/200/237/345/274/200/345/247/213.md +48 -28
  6. package/public/docs/01-/345/212/237/350/203/275/347/211/271/346/200/247.md +55 -40
  7. package/public/docs/02-Markdown/346/270/262/346/237/223/00-/345/237/272/347/241/200/350/257/255/346/263/225.md +88 -0
  8. package/public/docs/02-Markdown/346/270/262/346/237/223/01-/344/273/243/347/240/201/345/235/227.md +91 -0
  9. package/public/docs/02-Markdown/346/270/262/346/237/223/02-/350/241/250/346/240/274.md +187 -0
  10. package/public/docs/02-Markdown/346/270/262/346/237/223/03-Mermaid/345/233/276/350/241/250.md +101 -0
  11. package/public/docs/02-Markdown/346/270/262/346/237/223/04-Frontmatter.md +32 -0
  12. package/public/docs/02-Markdown/346/270/262/346/237/223/05-/346/225/260/345/255/246/345/205/254/345/274/217.md +47 -0
  13. package/public/docs/02-Markdown/346/270/262/346/237/223/06-Mermaid/345/244/215/346/235/202/345/233/276/350/241/250/346/265/213/350/257/225.md +1376 -0
  14. package/public/docs/02-Markdown/346/270/262/346/237/223/assets/img-1777383093712.png +0 -0
  15. package/public/docs/03-/345/257/274/350/210/252/344/270/216/345/270/203/345/261/200/00-/344/270/211/346/240/217/345/270/203/345/261/200.md +33 -0
  16. package/public/docs/03-/345/257/274/350/210/252/344/270/216/345/270/203/345/261/200/01-/347/233/256/345/275/225/346/240/221/345/257/274/350/210/252.md +43 -0
  17. package/public/docs/03-/345/257/274/350/210/252/344/270/216/345/270/203/345/261/200/02-/346/226/207/346/241/243/345/244/247/347/272/262.md +51 -0
  18. package/public/docs/03-/345/257/274/350/210/252/344/270/216/345/270/203/345/261/200/03-/344/270/212/344/270/213/347/257/207/345/257/274/350/210/252.md +29 -0
  19. package/public/docs/03-/345/257/274/350/210/252/344/270/216/345/270/203/345/261/200/04-/347/253/231/345/206/205/351/223/276/346/216/245.md +39 -0
  20. package/public/docs/03-/345/257/274/350/210/252/344/270/216/345/270/203/345/261/200/05-/345/244/247/347/272/262/345/216/213/345/212/233/346/265/213/350/257/225.md +340 -0
  21. package/public/docs/04-/346/220/234/347/264/242/345/212/237/350/203/275/00-/345/205/250/346/226/207/346/220/234/347/264/242.md +46 -0
  22. package/public/docs/05-/347/274/226/350/276/221/345/212/237/350/203/275/00-/347/274/226/350/276/221/345/231/250/345/237/272/347/241/200.md +65 -0
  23. package/public/docs/05-/347/274/226/350/276/221/345/212/237/350/203/275/01-/350/207/252/345/212/250/344/277/235/345/255/230.md +38 -0
  24. package/public/docs/06-/351/230/205/350/257/273/344/275/223/351/252/214/00-/351/230/205/350/257/273/350/277/233/345/272/246.md +43 -0
  25. package/public/docs/06-/351/230/205/350/257/273/344/275/223/351/252/214/01-/345/233/276/347/211/207/346/224/276/345/244/247.md +40 -0
  26. package/public/docs/06-/351/230/205/350/257/273/344/275/223/351/252/214/02-/350/277/224/345/233/236/351/241/266/351/203/250.md +38 -0
  27. package/public/docs/06-/351/230/205/350/257/273/344/275/223/351/252/214/assets/img-1777261394722.png +0 -0
  28. package/public/docs/07-/347/247/273/345/212/250/347/253/257/351/200/202/351/205/215/00-/345/223/215/345/272/224/345/274/217/345/270/203/345/261/200.md +37 -0
  29. package/public/docs/08-/346/226/207/346/241/243/347/256/241/347/220/206/00-/346/226/260/345/273/272/344/270/216/345/210/240/351/231/244.md +47 -0
  30. package/public/docs/09-/345/257/274/345/207/272/345/212/237/350/203/275/00-/345/257/274/345/207/272Word.md +77 -0
  31. package/public/docs/10-/351/203/250/347/275/262/344/270/216/351/205/215/347/275/256/00-CLI/345/267/245/345/205/267.md +52 -0
  32. package/public/docs/10-/351/203/250/347/275/262/344/270/216/351/205/215/347/275/256/01-SSG/351/235/231/346/200/201/346/236/204/345/273/272.md +44 -0
  33. package/public/docs/10-/351/203/250/347/275/262/344/270/216/351/205/215/347/275/256/02-/350/207/252/345/256/232/344/271/211/351/205/215/347/275/256.md +58 -0
  34. package/public/docs/11-/345/244/232/347/272/247/347/233/256/345/275/225/346/265/213/350/257/225/00-/344/270/200/347/272/247/346/226/207/346/241/243.md +20 -0
  35. package/public/docs/11-/345/244/232/347/272/247/347/233/256/345/275/225/346/265/213/350/257/225/01-/345/255/220/347/233/256/345/275/225/00-/344/272/214/347/272/247/346/226/207/346/241/243.md +13 -0
  36. package/public/docs/11-/345/244/232/347/272/247/347/233/256/345/275/225/346/265/213/350/257/225/01-/345/255/220/347/233/256/345/275/225/01-/346/267/261/345/261/202/345/265/214/345/245/227/00-/344/270/211/347/272/247/346/226/207/346/241/243.md +23 -0
  37. package/src/App.vue +111 -12
  38. package/src/components/AppSidebar.vue +181 -21
  39. package/src/components/CodeBlockNodeView.vue +72 -0
  40. package/src/components/DocContent.vue +25 -14
  41. package/src/components/EditorContent.vue +257 -0
  42. package/src/components/EditorToolbar.vue +264 -0
  43. package/src/components/ImageZoom.vue +88 -5
  44. package/src/components/MathBlockNodeView.vue +160 -0
  45. package/src/components/MathInlineNodeView.vue +145 -0
  46. package/src/components/MermaidNodeView.vue +157 -0
  47. package/src/components/MobileSearch.vue +97 -0
  48. package/src/components/TableOfContents.vue +174 -32
  49. package/src/components/TopBar.vue +69 -4
  50. package/src/components/TreeNode.vue +232 -39
  51. package/src/components/WelcomePage.vue +2 -2
  52. package/src/composables/useDocHash.js +9 -1
  53. package/src/composables/useDocManager.js +452 -105
  54. package/src/composables/useDocTree.js +33 -2
  55. package/src/composables/useExportWord.js +73 -10
  56. package/src/composables/useFileWatcher.js +45 -0
  57. package/src/composables/useFrontmatter.js +2 -2
  58. package/src/composables/useMarkdown.js +450 -52
  59. package/src/composables/useMermaidCache.js +15 -0
  60. package/src/composables/useScroll.js +354 -27
  61. package/src/composables/useSearch.js +12 -11
  62. package/src/config.js +1 -4
  63. package/src/extensions/CodeBlockCustom.js +113 -0
  64. package/src/extensions/MathBlock.js +107 -0
  65. package/src/extensions/MathInline.js +100 -0
  66. package/src/extensions/MermaidBlock.js +73 -0
  67. package/src/extensions/TableControls.js +670 -0
  68. package/src/services/DocService.js +168 -0
  69. package/src/style.css +2416 -36
  70. package/src/utils/imageConverter.js +129 -0
  71. package/vite-plugin-doc-api.js +369 -0
  72. package/vite.config.js +7 -2
  73. package/public/docs/02-Mermaid/345/233/276/350/241/250.md +0 -102
  74. package/public/docs/03-/350/277/233/351/230/266/346/214/207/345/215/227/01-/347/233/256/345/275/225/347/273/223/346/236/204.md +0 -55
  75. package/public/docs/03-/350/277/233/351/230/266/346/214/207/345/215/227/02-/350/207/252/345/256/232/344/271/211/351/205/215/347/275/256.md +0 -63
  76. package/public/docs/03-/350/277/233/351/230/266/346/214/207/345/215/227/03-/351/203/250/347/275/262/346/226/271/346/241/210.md +0 -73
  77. package/public/docs/04-API/345/217/202/350/200/203/01-/347/273/204/344/273/266API.md +0 -80
  78. package/public/docs/04-API/345/217/202/350/200/203/02-Composables.md +0 -92
  79. package/src/api/docs.js +0 -106
  80. package/src/components/SearchPanel.vue +0 -90
@@ -0,0 +1,33 @@
1
+ # 三栏布局
2
+
3
+ 验证三栏布局的显示效果和交互行为。
4
+
5
+ ## 布局结构
6
+
7
+ 界面采用经典的三栏布局:
8
+
9
+ | 区域 | 位置 | 功能 |
10
+ |------|------|------|
11
+ | 侧边栏 | 左侧 | 文档导航树 |
12
+ | 内容区 | 中间 | 文档内容渲染 |
13
+ | 大纲栏 | 右侧 | 文档标题大纲 |
14
+
15
+ ## 拖拽调整宽度
16
+
17
+ - 侧边栏和内容区之间有拖拽条,可调整侧边栏宽度(200~400px)
18
+ - 内容区和大纲栏之间有拖拽条,可调整大纲栏宽度(200~400px)
19
+ - 拖拽时鼠标变为 `col-resize` 样式
20
+
21
+ ## 折叠与展开
22
+
23
+ - 侧边栏可通过左上角按钮收起,收起后显示展开按钮
24
+ - 大纲栏可通过右上角按钮收起,收起后显示展开按钮
25
+ - 折叠后内容区自动占满剩余空间
26
+
27
+ ## 验证要点
28
+
29
+ 1. 拖拽左侧分隔条,侧边栏宽度应在 200~400px 范围内变化
30
+ 2. 拖拽右侧分隔条,大纲栏宽度应在 200~400px 范围内变化
31
+ 3. 点击侧边栏收起按钮,侧边栏应隐藏
32
+ 4. 点击大纲栏收起按钮,大纲栏应隐藏
33
+ 5. 收起后点击展开按钮,对应栏目应恢复
@@ -0,0 +1,43 @@
1
+ # 目录树导航
2
+
3
+ 验证侧边栏目录树的自动生成、排序和交互功能。
4
+
5
+ ## 自动生成
6
+
7
+ - 递归扫描文档文件夹下的所有 `.md` 文件和子目录
8
+ - 自动生成多级树形导航结构
9
+ - 文件夹显示为可展开/收起的节点
10
+
11
+ ## 排序规则
12
+
13
+ 使用 `序号-名称` 格式控制排序:
14
+
15
+ | 文件名 | 显示名称 | 排序 |
16
+ |--------|----------|------|
17
+ | `00-快速开始.md` | 快速开始 | 0 |
18
+ | `01-功能特性.md` | 功能特性 | 1 |
19
+ | `02-Markdown渲染/` | Markdown渲染 | 2 |
20
+
21
+ 序号越小越靠前,无序号的文件排在最后。
22
+
23
+ ## 导航过滤
24
+
25
+ 侧边栏顶部有过滤输入框:
26
+
27
+ - 输入关键词实时过滤匹配的文档名
28
+ - 过滤时自动展开包含匹配项的文件夹
29
+ - 清空输入恢复完整目录树
30
+ - 无匹配结果时显示"没有匹配的文档"
31
+
32
+ ## 全部展开/收起
33
+
34
+ - 点击"全部展开"按钮,所有文件夹节点展开
35
+ - 点击"全部收起"按钮,所有文件夹节点收起
36
+
37
+ ## 验证要点
38
+
39
+ 1. 左侧导航应正确显示当前文档目录结构
40
+ 2. 点击文件夹节点应展开/收起子节点
41
+ 3. 在过滤框输入关键词,应实时过滤文档列表
42
+ 4. 点击文档节点应加载对应文档内容
43
+ 5. 当前文档应在导航中高亮显示
@@ -0,0 +1,51 @@
1
+ # 文档大纲 (TOC)
2
+
3
+ 验证右侧文档大纲的提取、高亮和跳转功能。
4
+
5
+ ## 大纲提取
6
+
7
+ 自动从文档内容中提取 h1 ~ h6 各级标题,生成大纲列表。
8
+
9
+ ## 二级标题示例
10
+
11
+ 这是二级标题下的内容。
12
+
13
+ ### 三级标题示例
14
+
15
+ 这是三级标题下的内容。
16
+
17
+ #### 四级标题示例
18
+
19
+ 这是四级标题下的内容。
20
+
21
+ ##### 五级标题示例
22
+
23
+ 这是五级标题下的内容。
24
+
25
+ ###### 六级标题示例
26
+
27
+ 这是六级标题下的内容。
28
+
29
+ ## 高亮跟随
30
+
31
+ - 滚动文档时,右侧大纲自动高亮当前阅读位置对应的标题
32
+ - 高亮判断逻辑:最后一个已滚过顶部的标题为当前激活项
33
+
34
+ ## 点击跳转
35
+
36
+ - 点击大纲中的标题项,文档内容平滑滚动到对应位置
37
+ - 跳转后 URL hash 更新为对应锚点
38
+
39
+ ## 标题锚点
40
+
41
+ 每个标题旁边有链接图标,点击可复制锚点链接:
42
+
43
+ - 锚点 ID 使用 github-slugger 生成,语义化且稳定
44
+ - 支持中文标题的 slug 生成
45
+
46
+ ## 验证要点
47
+
48
+ 1. 右侧大纲应列出本文档所有标题
49
+ 2. 滚动页面时,大纲中对应标题应高亮
50
+ 3. 点击大纲标题,页面应平滑滚动到对应位置
51
+ 4. 各级标题应有正确的缩进层级
@@ -0,0 +1,29 @@
1
+ # 上下篇导航
2
+
3
+ 验证文档底部的前后导航功能。
4
+
5
+ ## 功能说明
6
+
7
+ - 文档底部自动显示"上一篇"和"下一篇"链接
8
+ - 按目录树的扁平顺序计算前后关系
9
+ - 第一篇文档只显示"下一篇"
10
+ - 最后一篇文档只显示"上一篇"
11
+
12
+ ## 导航样式
13
+
14
+ | 位置 | 内容 |
15
+ | --- | --- |
16
+ | 左侧 | 上一篇(带左箭头图标) |
17
+ | 右侧 | 下一篇(带右箭头图标) |
18
+
19
+ 每个导航链接包含:
20
+
21
+ - 标签文字("上一篇"/"下一篇")
22
+ - 文档标题
23
+
24
+ ## 验证要点
25
+
26
+ 1. 本文档底部应显示上下篇导航
27
+ 2. 点击"上一篇"应跳转到前一个文档
28
+ 3. 点击"下一篇"应跳转到后一个文档
29
+ 4. 导航链接的标题应与目标文档一致
@@ -0,0 +1,39 @@
1
+ # 站内链接
2
+
3
+ 验证文档间的链接改写和跳转功能。
4
+
5
+ ## 站内文档链接
6
+
7
+ 以下链接指向本站其他文档,应自动改写为 SPA 路由:
8
+
9
+ - [快速开始](../00-快速开始.md)
10
+ - [功能特性](../01-功能特性.md)
11
+ - [Mermaid 图表](../02-Markdown渲染/04-Mermaid图表.md)
12
+
13
+ ## 站内锚点链接
14
+
15
+ 以下链接指向本文档内的锚点:
16
+
17
+ - [跳转到验证要点](#验证要点)
18
+ - [跳转到外部链接](#外部链接)
19
+
20
+ ## 外部链接
21
+
22
+ 以下链接指向外部网站,应在新标签页打开:
23
+
24
+ - [GitHub](https://github.com)
25
+ - [Vue.js 官网](https://vuejs.org)
26
+ - [Vite 官网](https://vitejs.dev)
27
+
28
+ ## 跨文档锚点链接
29
+
30
+ 以下链接指向其他文档的特定锚点:
31
+
32
+ - [Frontmatter 支持的字段](../02-Markdown渲染/05-Frontmatter.md#支持的字段)
33
+
34
+ ## 验证要点
35
+
36
+ 1. 站内文档链接点击后应在当前页面加载目标文档(SPA 路由)
37
+ 2. 站内锚点链接点击后应平滑滚动到对应位置
38
+ 3. 外部链接点击后应在新标签页打开
39
+ 4. 不存在的文档链接应显示为断链样式
@@ -0,0 +1,340 @@
1
+ # 大纲压力测试
2
+
3
+ 本文档用于测试右侧文档大纲(TOC)在大量标题锚点场景下的显示效果、滚动跟随和点击跳转功能。文档包含从 h1 到 h6 各级标题,总计超过 40 个锚点。
4
+
5
+ ## 第一章 项目概述
6
+
7
+ 本章介绍项目的基本背景和目标定位,帮助读者快速了解项目全貌。
8
+
9
+ 项目启动于 2024 年初,旨在构建一套轻量级的文档站点生成工具。核心理念是让开发者专注于内容创作,而非繁琐的站点配置。我们希望通过简洁的设计和强大的功能,降低文档维护的门槛。
10
+
11
+ ### 1.1 背景介绍
12
+
13
+ 随着开源生态的蓬勃发展,越来越多的项目需要高质量的文档支持。然而现有的文档工具要么过于复杂,要么功能不足,难以满足中小型项目的需求。
14
+
15
+ 在调研了市面上主流的文档工具后,我们发现大多数工具存在以下问题:配置繁琐、构建缓慢、定制困难。因此我们决定从零开始,打造一款真正好用的文档工具。
16
+
17
+ #### 1.1.1 行业现状
18
+
19
+ 当前文档工具市场呈现两极分化的趋势。一方面是功能全面但学习曲线陡峭的重型方案,如 Docusaurus、GitBook 等;另一方面是轻量但功能有限的简易方案,如纯静态 Markdown 渲染器。
20
+
21
+ 我们的目标是在两者之间找到平衡点,提供开箱即用的体验,同时保留足够的扩展能力。
22
+
23
+ ##### 1.1.1.1 国内生态
24
+
25
+ 国内开发者对中文文档的支持有着特殊需求,包括中文搜索、中文排版优化、中文锚点生成等。这些细节往往被国外工具忽略,导致使用体验不佳。
26
+
27
+ 我们在设计之初就将中文支持作为一等公民,确保所有功能在中文环境下都能完美运行。
28
+
29
+ ###### 1.1.1.1.1 社区反馈
30
+
31
+ 通过社区调研,我们收集到了大量用户反馈。超过 70% 的用户表示希望有一款支持中文的轻量级文档工具。这坚定了我们的开发方向。
32
+
33
+ ###### 1.1.1.1.2 竞品分析
34
+
35
+ 我们对比了 VitePress、Docusaurus、Nextra、Rspress 等主流方案,分析了各自的优缺点,最终确定了差异化的产品定位。
36
+
37
+ ##### 1.1.1.2 国际趋势
38
+
39
+ 从全球范围来看,文档即代码(Docs as Code)的理念正在被越来越多的团队接受。Markdown 作为文档格式的事实标准,其生态也在不断完善。
40
+
41
+ #### 1.1.2 技术选型
42
+
43
+ 经过多轮评估,我们最终选择了以下技术栈:
44
+
45
+ - 前端框架:Vue 3 + Composition API
46
+ - 构建工具:Vite
47
+ - Markdown 解析:markdown-it
48
+ - 编辑器:Tiptap
49
+ - 样式方案:Tailwind CSS
50
+
51
+ ### 1.2 目标定位
52
+
53
+ 我们的目标是打造一款面向中小型项目的文档工具,核心特点包括:零配置启动、实时预览、全文搜索、多端适配。
54
+
55
+ #### 1.2.1 核心用户
56
+
57
+ 主要面向以下用户群体:
58
+
59
+ 1. 开源项目维护者
60
+ 2. 技术团队内部文档管理
61
+ 3. 个人知识库搭建
62
+ 4. 产品帮助文档编写
63
+
64
+ #### 1.2.2 使用场景
65
+
66
+ 典型的使用场景包括 API 文档、使用指南、架构设计文档、团队规范文档等。无论是公开的开源文档还是私有的内部文档,都能很好地支持。
67
+
68
+ ## 第二章 架构设计
69
+
70
+ 本章深入介绍系统的整体架构设计,包括前端架构、数据流和模块划分。
71
+
72
+ ### 2.1 整体架构
73
+
74
+ 系统采用经典的三层架构:展示层、逻辑层、数据层。展示层负责 UI 渲染和用户交互,逻辑层处理业务规则和状态管理,数据层负责文档的读取和持久化。
75
+
76
+ 整体架构遵循单向数据流的原则,所有状态变更都通过明确的路径传递,便于调试和维护。
77
+
78
+ #### 2.1.1 前端架构
79
+
80
+ 前端采用 Vue 3 的 Composition API 进行开发,通过 composables 模式组织可复用逻辑。主要模块包括:
81
+
82
+ - 文档树管理(useDocTree)
83
+ - 文档内容管理(useDocManager)
84
+ - 搜索功能(useSearch)
85
+ - 滚动控制(useScroll)
86
+ - 移动端适配(useMobile)
87
+
88
+ 每个 composable 职责单一,通过组合的方式构建复杂功能,避免了传统 Options API 中逻辑分散的问题。
89
+
90
+ ##### 2.1.1.1 组件设计
91
+
92
+ 组件按照功能域划分,遵循单一职责原则。核心组件包括 AppSidebar(侧边栏)、DocContent(文档内容)、TableOfContents(目录大纲)、SearchPanel(搜索面板)等。
93
+
94
+ 每个组件都有清晰的 props 和 events 接口定义,组件间通过 provide/inject 或事件总线进行通信。
95
+
96
+ ###### 2.1.1.1.1 渲染组件
97
+
98
+ 渲染组件负责将 Markdown 内容转换为可视化的 HTML。支持代码高亮、数学公式、Mermaid 图表等扩展语法。渲染过程采用增量更新策略,避免不必要的 DOM 操作。
99
+
100
+ ###### 2.1.1.1.2 交互组件
101
+
102
+ 交互组件处理用户操作,如搜索、导航、编辑等。所有交互都经过防抖和节流处理,确保流畅的用户体验。
103
+
104
+ ##### 2.1.1.2 状态管理
105
+
106
+ 项目没有引入 Vuex 或 Pinia 等状态管理库,而是通过 Vue 3 的 reactive API 和 composables 模式实现轻量级状态管理。这种方式更加灵活,也减少了不必要的依赖。
107
+
108
+ #### 2.1.2 数据流设计
109
+
110
+ 数据流遵循单向流动原则:用户操作 -> 状态更新 -> 视图渲染。文档数据通过 API 层获取,经过解析和转换后存入响应式状态,最终驱动视图更新。
111
+
112
+ ### 2.2 模块划分
113
+
114
+ 系统按照功能域划分为以下核心模块,每个模块独立开发、独立测试。
115
+
116
+ #### 2.2.1 文档解析模块
117
+
118
+ 负责将 Markdown 源文件解析为结构化数据。支持标准 Markdown 语法以及多种扩展语法,包括 Frontmatter、数学公式、Mermaid 图表等。
119
+
120
+ 解析过程分为两个阶段:词法分析和语法分析。词法分析将源文本拆分为 token 序列,语法分析将 token 序列转换为 AST(抽象语法树)。
121
+
122
+ #### 2.2.2 路由模块
123
+
124
+ 路由模块基于 hash 模式实现,将 URL 路径映射到对应的文档文件。支持多级目录结构和中文路径,确保文档链接的稳定性和可分享性。
125
+
126
+ #### 2.2.3 搜索模块
127
+
128
+ 搜索模块实现了全文搜索功能,支持中文分词和关键词高亮。搜索索引在文档加载时构建,采用倒排索引结构,确保搜索响应速度。
129
+
130
+ #### 2.2.4 编辑模块
131
+
132
+ 编辑模块基于 Tiptap 编辑器实现,支持所见即所得的 Markdown 编辑体验。编辑器内置了丰富的工具栏和快捷键,降低了 Markdown 的学习门槛。
133
+
134
+ ### 2.3 性能优化
135
+
136
+ 性能是我们始终关注的重点。通过多种优化手段,确保文档站点在各种设备上都能流畅运行。
137
+
138
+ #### 2.3.1 懒加载策略
139
+
140
+ 文档内容采用按需加载策略,只有当用户导航到某个文档时才会请求其内容。同时对图片和代码块实现了视口内懒加载,减少初始加载时间。
141
+
142
+ #### 2.3.2 缓存机制
143
+
144
+ 多层缓存机制确保重复访问的文档能够快速展示。包括内存缓存、浏览器缓存和 Service Worker 缓存三个层级,根据数据的时效性选择合适的缓存策略。
145
+
146
+ ## 第三章 功能实现
147
+
148
+ 本章详细介绍各核心功能的实现细节和技术方案。
149
+
150
+ ### 3.1 Markdown 渲染
151
+
152
+ Markdown 渲染是文档工具的核心能力。我们基于 markdown-it 实现了完整的渲染管线,支持标准语法和多种扩展。
153
+
154
+ 渲染管线的设计遵循插件化原则,每种扩展语法都通过独立的插件实现,便于维护和扩展。
155
+
156
+ #### 3.1.1 代码高亮
157
+
158
+ 代码高亮基于 highlight.js 实现,支持超过 180 种编程语言的语法高亮。同时提供了行号显示、代码复制、语言标签等增强功能。
159
+
160
+ ##### 3.1.1.1 主题定制
161
+
162
+ 支持自定义代码高亮主题,内置了多套配色方案。用户可以通过 CSS 变量轻松切换主题,也可以完全自定义配色。
163
+
164
+ ##### 3.1.1.2 性能优化
165
+
166
+ 对于超长代码块,采用虚拟滚动技术,只渲染视口内的代码行,避免大量 DOM 节点导致的性能问题。
167
+
168
+ #### 3.1.2 数学公式
169
+
170
+ 数学公式渲染基于 KaTeX 实现,支持行内公式和块级公式。KaTeX 相比 MathJax 有更快的渲染速度,适合文档场景。
171
+
172
+ 行内公式示例:$E = mc^2$,块级公式支持复杂的数学表达式。
173
+
174
+ #### 3.1.3 图表渲染
175
+
176
+ Mermaid 图表渲染支持流程图、时序图、甘特图、类图等多种图表类型。图表在文档加载时异步渲染,不阻塞主内容的展示。
177
+
178
+ ### 3.2 导航系统
179
+
180
+ 导航系统是文档站点的骨架,决定了用户浏览文档的效率和体验。
181
+
182
+ #### 3.2.1 目录树
183
+
184
+ 左侧目录树支持多级嵌套,自动从文件系统结构生成。支持展开/折叠、当前文档高亮、拖拽排序等交互功能。
185
+
186
+ 目录树的数据结构采用递归树形结构,每个节点包含标题、路径、子节点等信息。
187
+
188
+ ##### 3.2.1.1 排序规则
189
+
190
+ 文档排序支持两种模式:文件名前缀排序(如 00-、01-)和自然排序。前缀排序适合需要精确控制顺序的场景,自然排序适合随意组织的文档。
191
+
192
+ ##### 3.2.1.2 图标系统
193
+
194
+ 目录树中的图标根据节点类型自动匹配:文件夹使用目录图标,文档使用文件图标。展开/折叠状态也有对应的图标变化。
195
+
196
+ #### 3.2.2 文档大纲
197
+
198
+ 右侧文档大纲从当前文档内容中提取各级标题,生成可点击的导航列表。支持滚动跟随高亮和点击平滑跳转。
199
+
200
+ 这正是本文档重点测试的功能。当标题数量很多时,大纲列表需要自身支持滚动,并且保持良好的可读性。
201
+
202
+ #### 3.2.3 面包屑导航
203
+
204
+ 顶部面包屑显示当前文档在目录树中的完整路径,方便用户了解当前位置和快速跳转到上级目录。
205
+
206
+ #### 3.2.4 上下篇导航
207
+
208
+ 文档底部提供上一篇和下一篇的导航链接,方便用户按顺序阅读文档。导航顺序与目录树的排列顺序一致。
209
+
210
+ ### 3.3 搜索功能
211
+
212
+ 全文搜索是提升文档可用性的关键功能。用户可以通过关键词快速定位到目标内容。
213
+
214
+ #### 3.3.1 索引构建
215
+
216
+ 搜索索引在文档首次加载时构建,采用倒排索引结构。索引数据存储在内存中,支持增量更新。对于大型文档站点,索引构建过程在 Web Worker 中异步执行,不阻塞主线程。
217
+
218
+ #### 3.3.2 中文分词
219
+
220
+ 中文搜索的核心挑战是分词。我们采用了基于字典的正向最大匹配算法,结合 N-gram 模型,实现了较好的中文分词效果。
221
+
222
+ #### 3.3.3 结果排序
223
+
224
+ 搜索结果按照相关度排序,综合考虑关键词出现频率、位置权重(标题 > 正文)、文档权重等因素。排序算法参考了 BM25 模型。
225
+
226
+ ### 3.4 编辑功能
227
+
228
+ 内置编辑器让用户可以直接在浏览器中编辑文档,无需切换到代码编辑器。
229
+
230
+ #### 3.4.1 所见即所得
231
+
232
+ 基于 Tiptap 实现的所见即所得编辑器,用户在编辑时就能看到最终的渲染效果。支持常用的格式化操作,如加粗、斜体、列表、链接等。
233
+
234
+ #### 3.4.2 自动保存
235
+
236
+ 编辑器支持自动保存功能,在用户停止输入一段时间后自动将内容保存到服务端。同时提供手动保存的快捷键(Ctrl+S)。
237
+
238
+ #### 3.4.3 协同编辑
239
+
240
+ 未来计划支持多人协同编辑,基于 CRDT 算法实现冲突解决。目前已预留了协同编辑的接口设计。
241
+
242
+ ## 第四章 部署方案
243
+
244
+ 本章介绍项目的部署方式和配置选项。
245
+
246
+ ### 4.1 CLI 工具
247
+
248
+ 提供命令行工具 `markdoc` 用于项目初始化、开发预览和生产构建。
249
+
250
+ #### 4.1.1 初始化命令
251
+
252
+ 通过 `markdoc init` 命令可以快速创建一个新的文档项目,自动生成目录结构和配置文件。
253
+
254
+ #### 4.1.2 开发模式
255
+
256
+ `markdoc dev` 启动本地开发服务器,支持热更新和实时预览。开发服务器基于 Vite 构建,启动速度极快。
257
+
258
+ #### 4.1.3 生产构建
259
+
260
+ `markdoc build` 执行生产构建,生成优化后的静态文件。构建过程包括代码压缩、资源优化、预渲染等步骤。
261
+
262
+ ### 4.2 静态部署
263
+
264
+ 构建产物为纯静态文件,可以部署到任何静态文件托管服务。
265
+
266
+ #### 4.2.1 GitHub Pages
267
+
268
+ 支持一键部署到 GitHub Pages,通过 GitHub Actions 实现自动化构建和部署。只需在仓库中添加工作流配置文件即可。
269
+
270
+ #### 4.2.2 Vercel
271
+
272
+ Vercel 部署同样简单,连接 Git 仓库后自动检测项目类型并完成部署。支持自定义域名和 HTTPS。
273
+
274
+ #### 4.2.3 Nginx
275
+
276
+ 对于自建服务器的场景,提供了 Nginx 配置模板。包括 gzip 压缩、缓存策略、SPA 路由回退等最佳实践配置。
277
+
278
+ ### 4.3 自定义配置
279
+
280
+ 通过配置文件可以自定义站点的各项参数。
281
+
282
+ #### 4.3.1 站点信息
283
+
284
+ 配置站点标题、描述、Logo、favicon 等基本信息。这些信息会显示在页面标题栏和浏览器标签页中。
285
+
286
+ #### 4.3.2 主题配置
287
+
288
+ 支持自定义主题色、字体、间距等样式参数。通过 CSS 变量实现,修改简单且不影响功能。
289
+
290
+ #### 4.3.3 插件系统
291
+
292
+ 预留了插件系统的扩展接口,允许用户通过插件扩展文档站点的功能。插件可以注册新的 Markdown 语法、添加页面组件、扩展构建流程等。
293
+
294
+ ## 第五章 测试与质量
295
+
296
+ 本章介绍项目的测试策略和质量保障措施。
297
+
298
+ ### 5.1 单元测试
299
+
300
+ 核心模块都有对应的单元测试,覆盖率目标为 80% 以上。测试框架使用 Vitest,与 Vite 生态无缝集成。
301
+
302
+ #### 5.1.1 工具函数测试
303
+
304
+ 工具函数的测试最为直接,输入输出明确,易于编写和维护。包括路径处理、字符串转换、数据格式化等函数的测试。
305
+
306
+ #### 5.1.2 Composable 测试
307
+
308
+ Composable 的测试需要模拟 Vue 的响应式环境。通过 @vue/test-utils 提供的工具函数,可以在测试中创建响应式上下文。
309
+
310
+ ### 5.2 集成测试
311
+
312
+ 集成测试验证多个模块协同工作的正确性,重点关注数据流和状态同步。
313
+
314
+ ### 5.3 E2E 测试
315
+
316
+ 端到端测试基于 Playwright 实现,模拟真实用户操作验证完整的功能流程。测试覆盖了文档浏览、搜索、编辑、导航等核心场景。
317
+
318
+ ## 第六章 未来规划
319
+
320
+ 本章展望项目的未来发展方向和计划中的新功能。
321
+
322
+ ### 6.1 国际化支持
323
+
324
+ 计划支持多语言文档,允许同一文档提供不同语言的版本。语言切换通过 URL 前缀或下拉菜单实现。
325
+
326
+ ### 6.2 版本管理
327
+
328
+ 支持文档的多版本管理,用户可以查看不同版本的文档内容。版本切换不影响当前的浏览位置。
329
+
330
+ ### 6.3 AI 辅助
331
+
332
+ 探索 AI 技术在文档领域的应用,包括智能搜索、自动摘要、翻译辅助、写作建议等功能。
333
+
334
+ ### 6.4 性能监控
335
+
336
+ 内置性能监控面板,实时展示页面加载时间、渲染性能、内存占用等指标,帮助开发者优化文档站点的性能。
337
+
338
+ ---
339
+
340
+ 以上内容包含了从 h1 到 h6 共六个层级、超过 40 个标题锚点,用于验证右侧文档大纲在大量标题场景下的显示效果、滚动行为和交互体验。
@@ -0,0 +1,46 @@
1
+ # 全文搜索
2
+
3
+ 验证全文搜索的索引构建、中文分词和搜索交互。
4
+
5
+ ## 搜索入口
6
+
7
+ - 顶部搜索框:点击聚焦后展开下拉搜索结果
8
+ - 快捷键 Ctrl+K(Mac 下 Cmd+K)唤起搜索框
9
+
10
+ ## 搜索特性
11
+
12
+ | 特性 | 说明 |
13
+ | --- | --- |
14
+ | 中文分词 | 基于 bigram 分词,支持中文关键词搜索 |
15
+ | 模糊匹配 | fuzzy 参数 0.2,容忍少量拼写错误 |
16
+ | 前缀搜索 | 输入部分关键词即可匹配 |
17
+ | 标题加权 | 标题匹配权重为内容的 3 倍 |
18
+ | 懒加载索引 | 首次打开搜索时才构建索引 |
19
+
20
+ ## 搜索测试关键词
21
+
22
+ 以下关键词可用于测试搜索功能:
23
+
24
+ - 文档渲染系统
25
+ - Markdown 解析引擎
26
+ - 代码语法高亮
27
+ - Mermaid 图表绘制
28
+ - 响应式布局适配
29
+ - 全文检索引擎
30
+ - Tiptap 富文本编辑器
31
+
32
+ ## 搜索交互
33
+
34
+ 1. 输入关键词,下拉列表实时显示匹配结果
35
+ 2. 键盘上下键移动选中项
36
+ 3. 回车键确认选中,跳转到对应文档
37
+ 4. ESC 键关闭搜索
38
+ 5. 搜索结果按相关度排序,最多显示 20 条
39
+
40
+ ## 验证要点
41
+
42
+ 1. Ctrl+K 应聚焦搜索框
43
+ 2. 输入"Mermaid"应匹配到 Mermaid 图表文档
44
+ 3. 输入中文关键词"布局"应匹配到相关文档
45
+ 4. 点击搜索结果应跳转到对应文档
46
+ 5. 首次搜索时应有索引构建过程
@@ -0,0 +1,65 @@
1
+ # 编辑器基础
2
+
3
+ 验证 Tiptap 富文本编辑器的各项编辑功能。
4
+
5
+ ## 模式切换
6
+
7
+ 顶部工具栏提供查看/编辑模式切换按钮:
8
+
9
+ - 查看模式:渲染后的 HTML 内容,只读
10
+ - 编辑模式:Tiptap 富文本编辑器,可编辑
11
+
12
+ 切换时保持阅读位置(三级策略):
13
+ 1. 通过锚点 ID 定位
14
+ 2. 通过标题文本匹配
15
+ 3. 按滚动比例恢复
16
+
17
+ ## 工具栏功能
18
+
19
+ ### 文本格式
20
+
21
+ | 功能 | 快捷键 | 说明 |
22
+ |------|--------|------|
23
+ | 加粗 | Ctrl+B | **粗体文本** |
24
+ | 斜体 | Ctrl+I | *斜体文本* |
25
+ | 下划线 | Ctrl+U | 下划线文本 |
26
+ | 删除线 | - | ~~删除线文本~~ |
27
+ | 行内代码 | - | `行内代码` |
28
+
29
+ ### 标题
30
+
31
+ 支持 H1 ~ H4 四级标题快速切换。
32
+
33
+ ### 列表
34
+
35
+ - 无序列表
36
+ - 有序列表
37
+ - 任务列表
38
+
39
+ ### 块级元素
40
+
41
+ - 引用块
42
+ - 分割线
43
+ - 代码块(支持语言标签输入,``` 输入规则触发)
44
+ - 表格(插入 3x3 表格,支持调整大小和气泡菜单)
45
+ - 图片(通过 URL 插入)
46
+
47
+ ### 撤销/重做
48
+
49
+ - Ctrl+Z 撤销
50
+ - Ctrl+Shift+Z 重做
51
+
52
+ ## Mermaid 编辑
53
+
54
+ 编辑模式下 Mermaid 代码块渲染为图表预览:
55
+
56
+ - 右上角编辑按钮进入代码编辑模式
57
+ - 编辑完成后点击"完成"按钮回到预览
58
+ - 实时渲染图表,渲染失败时显示错误提示
59
+
60
+ ## 验证要点
61
+
62
+ 1. 点击"编辑"按钮应切换到编辑模式
63
+ 2. 工具栏各按钮应正常工作
64
+ 3. 编辑内容后切回查看模式,内容应同步更新
65
+ 4. Mermaid 代码块应显示为图表预览
@@ -0,0 +1,38 @@
1
+ # 自动保存
2
+
3
+ 验证编辑模式下的自动保存机制。
4
+
5
+ ## 保存策略
6
+
7
+ | 触发条件 | 延迟 | 说明 |
8
+ |----------|------|------|
9
+ | 内容变更 | 1 秒防抖 | 编辑内容后 1 秒无操作自动保存 |
10
+ | 组件卸载 | 立即 | 切换文档或退出编辑模式时立即保存 |
11
+
12
+ ## 工作流程
13
+
14
+ 1. 用户在编辑器中修改内容
15
+ 2. 每次修改触发 `onUpdate` 回调
16
+ 3. 启动 1 秒防抖定时器
17
+ 4. 1 秒内无新修改,调用 `saveDoc` API 保存
18
+ 5. 保存成功后重置文件 ETag,避免轮询误判为外部变更
19
+
20
+ ## 保存 API
21
+
22
+ ```javascript
23
+ // POST /api/save
24
+ {
25
+ path: "相对文件路径",
26
+ content: "Markdown 文本内容"
27
+ }
28
+ ```
29
+
30
+ - 服务端自动创建不存在的父目录
31
+ - 路径安全检查,防止路径穿越攻击
32
+
33
+ ## 验证要点
34
+
35
+ 1. 编辑模式下修改内容,等待 1 秒后文件应自动保存
36
+ 2. 快速连续输入时,只在最后一次输入后 1 秒保存(防抖)
37
+ 3. 切换到查看模式时,未保存的内容应立即保存
38
+ 4. 切换到其他文档时,当前文档应立即保存