维刻 文档
dotnet9
维刻 / 文档 / Vex Markdown 编辑器需求规格说明书

Vex Markdown 编辑器需求规格说明书

⏱ 预计阅读 43 分钟 平台:windows / macos 同步于 2026-10-03 来源: Vex · docs/Vex需求文档.md ✎ 在 GitHub 编辑此页

1. 文档目标

本文档用于指导 AI 或工程师持续开发 Vex,使其从基础 Markdown 编辑器逐步成长为成熟、稳定、可发布的桌面产品。实现时应把本文档视为产品规格、架构约束、验收清单和迭代路线图的统一来源。

任何新增功能都必须满足以下原则:

  1. 先理解现有代码结构,再按现有模块边界最小改动。
  2. 每完成一个可独立体验的小功能,都要构建验证、必要时截图验证,并更新开发日志与中英文更新日志。
  3. 提交信息使用英文规范化提交,并推送到远端。
  4. 不为了赶功能牺牲桌面产品体验。文本不能溢出,控件不能互相遮挡,布局在最小窗口尺寸下仍可用。
  5. 不新增来源不清楚、源码不可查或许可证不合规的第三方组件。

2. 产品基础信息

项目 内容
产品名称 Vex
中文名称 维刻
英文品牌 CodeWF
中文品牌 码坊
Slogan 极简之力,妙笔成章
作者 沙漠尽头的狼
官网 https://codewf.com
产品类型 跨平台 Markdown 桌面编辑器
体验参考 Typora
技术参考 https://github.com/dotnet9/CodeWF.Markdown/tree/main/src/CodeWF.Markdown.Sample
参考素材 .\docs\typora

AssemblyInfo、About、帮助文档、发布元数据等涉及网站时,统一使用 https://codewf.com,不要使用二级域名。

3. 产品定位

Vex 是面向写作者、开发者和知识工作者的 Markdown 编辑器。核心体验应接近 Typora 的克制、直接和高效率,同时保留专业桌面软件需要的文件管理、编码选择、导出、打印、主题、国际化和跨平台发布能力。

3.1 用户目标

  1. 快速新建、打开、编辑、保存 Markdown 文档。
  2. 在源码编辑与实时预览之间自由切换。
  3. 通过文件夹视图管理一组 Markdown 文档。
  4. 通过大纲快速定位标题。
  5. 通过菜单、快捷键和右键操作高效完成格式化、查找替换、导出和打印。
  6. 使用合适的主题、排版和语言环境,长时间写作不疲劳。
  7. 在 Windows、Linux、macOS 上获得一致的核心体验。

3.2 体验原则

  1. 打开即写:启动后光标应能快速进入编辑区,默认文档不制造无意义干扰。
  2. 状态明确:窗口标题、状态栏和属性面板都要反映当前文件名、保存状态、编码和路径。
  3. 操作可逆:删除、关闭有未保存内容、覆盖保存等风险操作必须有确认或保护。
  4. 快捷键优先:高频操作必须支持桌面常见快捷键。
  5. 预览可信:编辑区与预览区应尽量同步,导出 HTML/PDF/PNG 的视觉结果应接近预览。
  6. 文件安全:保存、另存为、编码重开、删除、导出不得造成数据丢失或路径误判。

4. 技术栈与硬性约束

4.1 框架

  1. 解决方案使用 .slnx。
  2. 主程序使用 Avalonia 最新规范开发,目标框架使用当前仓库配置。
  3. 模块化使用 Prism 8.x 与 DryIoc。
  4. ViewModel 使用 ReactiveUI。
  5. UI 绑定命令优先直接绑定 ViewModel 的 public 方法,方法可为同步或 async。
  6. 编辑器、模块、View、ViewModel 间的业务消息使用 CodeWF.EventBus。
  7. View 拆分必须有明确职责,不用 partial 伪拆分;单个 .axaml 或 .cs 超过约 500-600 行时应优先拆成独立 UserControl、ViewModel 或服务,文件代码行数不是硬性规定,优先保证业务逻辑清晰,其次代码优雅、可读性好。
  8. Prism IoC、AutoWireViewModel 和 Region 应优先用于模块组合;TabControl、内容区等可扩展区域不应长期硬编码页面。
  9. ViewModel 之间避免强耦合,跨模块动作优先通过 CodeWF.EventBus 消息表达。
  10. .axaml.cs 只保留必须由 View 承担的控件事件、窗口生命周期和平台交互,业务操作放入 ViewModel 或服务。

4.2 UI 库与主题

  1. 主 UI 使用 Semi.Avalonia 与 Ursa.Avalonia NuGet 包,支持Semi的所有主题(跟随系统、浅色模式、深色模式、水生、沙漠、黄昏、夜空等),参考用法https://github.com/dotnet9/CodeWF.Toolbox/tree/develop,本地对应仓库目录D:\github\apps\CodeWF.Toolbox,尽量使用Ursa的控件,包括他的UrsaWindow做为窗体基类。
  2. Markdown 排版主题使用参考https://github.com/dotnet9/CodeWF.Markdown,本地对应仓库目录D:\github\CodeWF.Markdown,完整支持10几种排版主题。
  3. Avalonia.Themes.Fluent 允许保留,用于 AvaloniaEdit 适配和必要的基础主题补充。
  4. 不使用无源码仓库、许可证不可查或黑盒的 AvaloniaEdit 第三方主题包。
  5. 主题资源应拆分到 Vex.Controls 与 Vex.Controls.Themes,按 Semi.Avalonia 风格组织。
  6. 所有窗口必须继承 Ursa UrsaWindow,不要自绘标题栏控制按钮或重复实现 Ursa 已提供的窗口能力。

4.3 CodeWF 依赖

  1. CodeWF.EventBus、CodeWF.Markdown、CodeWF.Markdown.Themes、CodeWF.AvaloniaControls 等通过 NuGet 包安装使用,不通过项目引用直接引用。
  2. 如果 CodeWF 系列库存在问题,可直接修改对应仓库,本地打包后在 Vex 中使用,验证通过后再发布 NuGet;当前重点依赖仓库为 D:\github\CodeWF.Markdown 与 D:\github\CodeWF.AvaloniaControls。
  3. 修改 CodeWF 依赖库时,先在依赖库本地打包 NuGet,再更新 Vex 引用到本地包验证;验证通过前不要提交 Vex 或依赖库仓库。
  4. CodeWF.EventBus 统一直接使用 CodeWF.EventBus.EventBus.Default,不通过 IOC 注册或构造函数注入事件总线。
  5. Command、Query、Notification 等消息仍归 CodeWF.EventBus 管理,不使用 Prism 命令或事件替代。
  6. 不使用显式 Subscribe(Action<TCommand>) 这类写法。
  7. 推荐模式:ViewModel 或服务中声明 [EventHandler] 处理方法,并在构造函数通过 Subscribe(this) 注册。
  8. 不使用 CodeWF.DryIoc.EventBus 包;能放在 ViewModel 或已有服务的处理函数应直接放在对应对象内。

4.4 第三方组件合规

新增任何第三方开源组件前必须执行:

  1. 查询组件许可证,优先 MIT、Apache-2.0、BSD。
  2. 查询源码仓库,确认源码开放且可追溯。
  3. 穿透检查直接依赖与间接依赖,确认没有明显不合规或黑盒组件。
  4. GPL、AGPL、商业闭源、不明许可证等必须先与项目负责人讨论。
  5. 不创建单独的第三方审计文档;必要的许可证核查结果记录在开发日志或提交说明中即可。

5. 主窗口布局

5.1 框架布局

基于UrsaWindow的主窗口采用四行布局:

  1. 标题栏:Logo、产品名、标题栏菜单、当前文件名、窗口控制按钮。
  2. 查找/替换栏:按需显示,不常驻。
  3. 工作区:左侧文件/大纲、中间编辑器、右侧预览。
  4. 状态栏:状态文本、保存状态、编码、缩放、行列、词数、字符数。

菜单必须放在标题栏内,不额外占用客户区,当前文件名挨着菜单后摆放。

5.2 左侧侧边栏

  1. 使用 TabControl,包含“文件”和“大纲”两个 Tab。
  2. 文件 Tab 显示当前打开文件(夹)内的文件名,注意直接打开的文件也需要列在该TabItem内。
  3. 文件列表项展示文件名以及部分文件内容(截取前20个字符)。
  4. 文件列表为空时显示空状态,不显示空白列表。
  5. 文件列表右键菜单支持打开、重命名、打开文件位置和删除。
  6. 文件列表支持对 Markdown/txt 文件重命名,重命名后同步更新列表、标题、最近文件和当前打开文档路径。
  7. 大纲 Tab 根据当前 Markdown 标题生成,点击后跳转编辑器对应行。
  8. 无标题时显示空状态。
  9. 视图菜单中的“文档列表”和“大纲”必须自动展开侧边栏并切换到对应 Tab。

5.3 编辑器区域

  1. 使用 AvaloniaEdit 作为源码编辑器。
  2. 支持 UTF-8、UTF-8 BOM、GB18030、Big5 重新打开。
  3. 支持常用编辑操作:撤销、重做、剪切、复制、粘贴、全选。
  4. 支持插入或切换 Markdown 标记:标题、段落、表格、代码块、公式块、引用、有序列表、无序列表、任务列表、分割线、加粗、斜体、行内代码、链接、图像。
  5. 支持清除常见 Markdown 格式。
  6. 支持查找、查找下一个、替换下一个、全部替换。
  7. 支持行列状态同步。
  8. 支持缩放字体大小。
  9. 已支持语法高亮、当前行高亮、行号、Tab 行为、拖放打开文件和回车智能缩进;后续继续完善括号匹配等编辑细节。
  10. 支持网页 HTML 粘贴为 Markdown:场景是复制网页内容后粘贴到中间编辑器,编辑器应优先读取剪贴板 HTML,并通过 CodeWF.Markdown 公共转换能力自动转成 Markdown 后插入;没有 HTML 或转换失败时回落到普通文本粘贴。转换操作封装在 CodeWF.Markdown 控件库中,API 为:
csharp
string Html2Markdown(string htmlContent);

5.4 预览区域

  1. 使用 CodeWF.Markdown.Themes(引入了CodeWF.Markdown) 提供的 MarkdownViewer。
  2. 预览内容跟随当前 Markdown 实时更新。
  3. 支持排版主题切换(参考CodeWF.Markdown.Sample)。
  4. 支持紧凑布局切换(参考CodeWF.Markdown.Sample)。
  5. 预览滚动条显示。
  6. 源代码模式下临时隐藏预览和侧边栏,退出时恢复原布局状态。
  7. 支持编辑器与预览滚动同步;本地与相对路径图片应按当前文档目录解析,SVG 正常渲染,GIF 可播放;后续继续完善链接点击策略。
  8. 复杂 SVG 图片必须完整渲染,不得只显示背景、遮罩或局部元素;以 D:\wwwroot\img1.dotnet9.com\2026\05\codewf-avalonia-guide-cover.svg 作为回归样例,浏览器参考效果见 D:\temp_imgs\1212.png,Vex 当前缺失效果见 D:\temp_imgs\2121.png,SVG 原文件作为正确样例不得修改。

5.5 浮层与对话体验

当前窗口内浮层包括:

  1. 字数统计面板。
  2. 关于面板。
  3. 属性面板。
  4. 删除确认面板。
  5. 未保存确认面板。
  6. 错误提示面板。
  7. 文件重命名面板。

规则:

  1. 浮层宽度、内边距、边框、圆角保持一致。
  2. 信息型浮层不遮挡状态栏关键反馈。
  3. 删除确认必须显示文件名和完整路径,并明确永久删除;重命名面板必须显示原路径。
  4. Esc 应关闭信息型浮层;在删除确认中 Esc 等同取消。
  5. 浮层按钮文本不得溢出。

5.6 新手引导

新手引导使用 CodeWF.AvaloniaControls 的 Guide 控件。成熟要求:

  1. 步骤气泡、遮罩、高亮目标和箭头在浅色、深色及 Semi 主题色下都要清楚可辨。
  2. 目标控件与引导气泡之间必须显示明显的三角指示,参考 D:\temp_imgs\1212.png;不得出现箭头消失、方向错误、被遮罩吞掉或与气泡边缘融在一起。
  3. 当前步骤的目标控件应有足够醒目的高亮边框,边框厚度至少 2px 或达到同等视觉强调效果,不遮挡目标控件文字和图标。
  4. 靠近窗口边缘、菜单弹层、TabItem、状态栏等目标不得导致气泡越界,箭头仍应指向真实目标中心或最近可见边缘。
  5. Guide 控件本身的问题在 D:\github\CodeWF.AvaloniaControls 修复,本地打包 NuGet 后由 Vex 引用验证。

6. 菜单功能规格

6.1 文件菜单

菜单项 快捷键 行为 验收标准
新建 Ctrl+N 创建未保存文档,清空路径,重置保存状态 标题显示 Untitled.md - Vex,状态栏 Ready 或 New document created
新建窗口 启动新的 Vex 进程 新窗口可独立编辑
打开 Ctrl+O 打开文件选择器并加载文档 标题、编辑区、预览、状态栏全部更新
打开文件夹 打开文件夹选择器并加载文档列表 左侧文件列表显示 Markdown/txt 文件,默认打开首个文件
快速打开 有文件夹时聚焦文件列表,无文件夹时执行打开文件 状态提示准确
打开最近文件 显示最近 5 个文件 文件不存在时自动移除并提示
清空最近文件 清空最近文件列表 菜单禁用或显示空状态
选择编码重新打开 用指定编码重新读取当前文件 文本内容、编码徽标更新
复制到公众号 转为微信公众号支持的富 HTML 写入剪贴板,不复制 Markdown 原文 可在微信公众号文章编辑器粘贴,格式与当前排版主题一致
复制到知乎 转为知乎编辑器可粘贴的富 HTML 写入剪贴板,不复制 Markdown 原文 可在知乎文章编辑器粘贴,格式与当前排版主题一致
复制到稀土掘金 转为稀土掘金编辑器可粘贴的富 HTML 写入剪贴板,不复制 Markdown 原文 可在稀土掘金文章编辑器粘贴,格式与当前排版主题一致
保存 Ctrl+S 保存当前文档 未保存文档走另存为;保存后状态为 Saved
另存为 Ctrl+Shift+S 选择新路径保存 标题和路径更新
保存全部打开的文件 当前阶段可保存当前文档,后续多文档时保存全部 状态提示不误导
属性 Alt+Enter 打开属性对话框 基于 UrsaWindow,展示名称、状态、编码、大小、路径,长文本可选择复制
打开文件位置 在系统文件管理器定位当前文件 无当前文件时禁用
删除 打开删除确认对话框 基于 UrsaWindow,确认后删除磁盘文件、移除最近文件、回到新文档
导出 HTML 导出独立 HTML 文件 文件可由浏览器打开,内容和基础样式正确,本地图片按当前文档路径内联;导出成功后打开保存目录并定位文件
导出 PDF 导出分页 PDF 支持本地相对图、data:image、HTTP(S)、SVG/GIF/WebP 等图片源,正文文本可选择复制,图片等资源嵌入 PDF 文件;导出成功后打开保存目录并定位文件
导出 Word(docx) 导出 Word 文档 生成 .docx,保留基础 Markdown 结构、Word 样式和图片嵌入;SVG/GIF/WebP 等必要时转为 PNG;导出成功后打开保存目录并定位文件
导出 PNG 导出当前 Markdown 为长图 支持本地相对图、data:image、HTTP(S)、SVG/GIF/WebP 等图片源,图片等资源随渲染结果写入 PNG,长文档按长图策略输出;导出成功后打开保存目录并定位文件
打印 Ctrl+P 当前阶段生成 HTML 打印预览并交给系统浏览器 临时文件内容可打印
关闭 Ctrl+W 关闭当前文档,回到新文档 有未保存内容时提示保存

6.2 编辑菜单

菜单项 快捷键 行为
撤销 Ctrl+Z 编辑器撤销
重做 Ctrl+Y 编辑器重做
剪切 Ctrl+X 编辑器剪切
复制 Ctrl+C 编辑器复制
粘贴 Ctrl+V 编辑器粘贴;剪贴板含 HTML 时优先转 Markdown 后插入
全选 Ctrl+A 编辑器全选
查找 Ctrl+F 显示查找栏
替换 Ctrl+H 显示查找栏和替换输入
查找下一个 F3 执行下一处查找
关闭查找栏 Esc 查找栏显示时关闭查找栏

6.3 段落菜单

必须支持:

  1. 段落。
  2. 标题 1-6。
  3. 表格。
  4. 代码块。
  5. 公式块。
  6. 引用。
  7. 有序列表。
  8. 无序列表。
  9. 任务列表。
  10. 水平分割线。

行为要求:

  1. 如果有选区,对选区应用格式。
  2. 如果无选区,对当前行或插入点应用格式。
  3. 再次触发可尽量保持幂等,不重复堆叠无意义标记。
  4. 操作后焦点回到编辑器。

6.4 格式菜单

必须支持:

  1. 加粗。
  2. 斜体。
  3. 行内代码。
  4. 链接。
  5. 图像。
  6. 清除样式。

验收标准:

  1. 选中文本加粗后变为 **文本**。
  2. 选中文本斜体后变为 *文本*。
  3. 清除样式可移除常见 Markdown 标记,不破坏普通文本。

6.5 视图菜单

菜单项 快捷键 行为
显示/隐藏侧边栏 切换侧边栏
大纲 展开侧边栏并切换到大纲
文档列表 展开侧边栏并切换到文件
搜索 Ctrl+F 显示查找栏
源代码模式 隐藏侧边栏和预览,再次切换恢复原布局
显示源码编辑器 在可视化编辑模式下显示或隐藏中间源码编辑器
显示状态栏 切换状态栏
字数统计窗口 打开统计浮层
切换全屏 F11 切换 FullScreen
保持窗口在最前端 切换 Topmost
实际大小 Ctrl+0 缩放回 100%
放大 Ctrl+Plus 编辑器字体放大
缩小 Ctrl+Minus 编辑器字体缩小

6.6 主题菜单

帮助菜单直接展示以下主题相关入口,不再额外包一层“主题”子菜单:

  1. 主题色:跟随系统、浅色模式、深色模式、水生、沙漠、黄昏、夜空等,配置项为空时,默认跟随系统。
  2. 排版:迁移 CodeWF.Markdown.Sample 中的排版主题,如数迁移,多达15种+,例如简洁、Basic、橙心、墨黑、科技蓝,默认简洁。
  3. 紧凑布局。

要求:

  1. 主题切换应立即生效,并保存配置项,重启后使用配置项加载主题。
  2. 主题色影响窗口基础背景、菜单、边框、面板、编辑器和预览。
  3. 排版主题影响 Markdown 预览,修改时保存配置项,启动后使用配置项加载排版主题。
  4. 紧凑布局影响预览字体、间距和编辑体验。
  5. 菜单项应显示当前选择状态,并持久化用户选择。

6.7 国际化菜单

语言至少包含:

  1. 简体中文 zh-CN。
  2. 繁体中文 zh-Hant。
  3. English en-US。
  4. 日本語 ja-JP。

要求:

  1. 第一次启动,配置项语言为空,根据操作系统语言实现l10n,即支持本地化,缺省显示英文。
  2. 后续启动,根据配置项语言切换当前显示语言,不存在则缺省显示英文。
  3. 初始化语言不应在状态栏显示“语言切换成功”一类误导提示。
  4. 用户主动切换语言时应更新菜单、浮层、状态提示和帮助文案,更新配置项语言。
  5. 新增 UI 文案应同步维护 I18n 资源。

6.8 帮助菜单

菜单项 行为
更新日志 弹出更新日志对话框,使用 MarkdownViewer 加载内置 UpdateLog.md
鸣谢 弹出鸣谢对话框,使用 MarkdownViewer 加载内置 鸣谢.md
官方网站 打开 https://codewf.com
反馈 打开反馈入口,未确定前可打开官网
关于 打开关于面板

弹出的对话框皆基于Ursa的UrsaWindow。

关于面板必须展示:

  1. Vex。
  2. 中文名“维刻”。
  3. Slogan。
  4. 作者“沙漠尽头的狼”。
  5. CodeWF(码坊)。
  6. 官网 https://codewf.com。
  7. 使用CodeWF.Tools.Core NuGet包的AssemblyExtensions获取程序版本、编译时间、许可证和运行时信息。

7. 文件与编码规格

7.1 支持文件类型

默认支持:

  1. .md
  2. .markdown
  3. .txt

后续可扩展:

  1. .mdown
  2. .mkd
  3. .mdx,需确认渲染策略后再支持。

7.2 文件打开

  1. 文件打开后必须更新当前文档快照、窗口标题、状态栏、最近文件、大纲、统计、预览。
  2. 启动参数传入存在的文件路径时,启动后自动打开该文件。
  3. 启动参数传入存在的文件夹路径时,自动加载文件列表并打开排序后的首个 Markdown 文件。
  4. 文件不存在、无权限、编码失败时必须给出状态提示和错误提示浮层。

7.3 编码

  1. 默认 UTF-8 无 BOM。
  2. 支持 UTF-8 BOM。
  3. 支持 GB18030。
  4. 支持 Big5。
  5. 保存时使用当前文档 Encoding。
  6. 重新选择编码打开时不得自动覆盖原文件。

7.4 保存状态

  1. IsModified 由当前 Markdown 与最近一次保存快照比较得出。
  2. 未保存时窗口标题和当前文档标题前显示 *。
  3. 状态栏显示 Saved 或 Modified。
  4. 关闭文档、关闭窗口、打开新文件、删除文件前,如存在未保存改动,后续必须增加保存确认。

7.5 最近文件

  1. 最近文件保存到用户应用数据目录。
  2. 最多显示 10 个。
  3. 新打开的文件置顶。
  4. 重复打开同一路径不重复显示。
  5. 文件不存在时自动移除。

8. Markdown 能力规格

8.1 基础语法

必须正确编辑和预览:

  1. 标题。
  2. 段落。
  3. 加粗、斜体、删除线。
  4. 行内代码和代码块。
  5. 引用。
  6. 有序列表、无序列表、任务列表。
  7. 链接与图片。
  8. 表格。
  9. 水平分割线。
  10. HTML 片段。

8.2 扩展语法

优先支持:

  1. GFM 表格。
  2. 任务列表。
  3. 自动链接。
  4. 脚注。
  5. 数学公式块与行内公式。
  6. 目录锚点。
  7. 代码高亮。

扩展语法实现依赖 CodeWF.Markdown 或 Markdig 时,应确认渲染、导出和裁剪发布都正常。

8.3 大纲生成

  1. 根据 ATX 标题 # 到 ###### 生成。
  2. 忽略代码块内的伪标题。
  3. 标题文本应去除 Markdown 标记。
  4. 点击大纲项跳转到编辑器对应行。
  5. 大纲为空时展示空状态。

8.4 统计

实时统计:

  1. Words。
  2. Characters。
  3. Lines。

后续可扩展:

  1. Reading time。
  2. Headings。
  3. Paragraphs。
  4. Selected words。

9. 查找与替换规格

9.1 查找栏

  1. Ctrl+F 打开查找栏。
  2. 查找栏打开后应聚焦搜索输入框。
  3. F3 查找下一个。
  4. Esc 关闭查找栏并回到编辑器。
  5. 未输入搜索文本时状态栏提示。

9.2 替换

  1. Ctrl+H 打开替换模式。
  2. 替换下一个只替换当前匹配。
  3. 全部替换应返回替换数量。
  4. 搜索不到时状态栏提示。

9.3 查找增强

  1. 区分大小写。
  2. 全词匹配。
  3. 正则匹配。
  4. 循环搜索提示。
  5. 搜索结果计数,例如 3/12。

10. 复制自媒体

10.1 复制到公众号

  1. 点击“复制到公众号”必须复制微信公众号文章编辑器可直接粘贴的富 HTML,不是 Markdown 源文,也不是只包含普通文本的 HTML 字符串。
  2. 剪贴板必须通过 CodeWF.Markdown 的 MarkdownHtmlClipboardExtensions.TrySetMarkdownHtmlAsync(markdown, themeName, targetName, typographySize) 写入富 HTML 载荷:包括 text/html、macOS public.html 和 Windows 原生 HTML Format。Windows HTML Format 必须是 UTF-8 CF_HTML 字节数据,片段偏移按字节计算;同时可提供 plain text 兜底,兜底内容应是完整 HTML 片段,不应回退为 Markdown。
  3. HTML 片段根节点使用 section#vex,包含多语言资源解析后的 data-tool、data-website="https://codewf.com" 和必要的 inline style。
  4. 公众号内容必须使用当前 Markdown、当前排版主题和紧凑布局配置生成;所有公众号需要的样式写入 inline style,不依赖外部 CSS、外部 class 或运行时脚本。
  5. 标题、段落、列表、引用、代码块、表格、链接和图片至少应在微信公众号编辑器中保持可读排版;本地图片按当前复制能力内联或转换为粘贴后可显示的资源。
  6. 主题色、标题边框、段落间距、代码块背景、表格边框等样式应与 Vex 预览和 CodeWF.Markdown 排版主题保持一致。
  7. 最小验收样例:
markdown
## 这是标题
这是内容

剪贴板 HTML 片段应为类似结构,具体颜色和间距随当前排版主题变化:

html
<section id="vex" data-tool="{localized tool name}" data-website="https://codewf.com" style="font-size: 15px; color: #333333; background: #ffffff; padding: 25px 30px; line-height: 1.75; word-break: break-word; text-align: justify;">
  <h2 style="margin-top: 30px; font-weight: bold; font-size: 26px; border-bottom: 2px solid #dfe2e5; margin-bottom: 30px; color: #333333;">
    <span class="content" style="font-size: 26px; display: inline-block; border-bottom: 2px solid #333333;">这是标题</span>
  </h2>
  <p style="font-size: 15px; padding-top: 8px; padding-bottom: 8px; margin: 0; line-height: 26.25px; color: #333333;">这是内容</p>
</section>
  1. 验收时必须把剪贴板内容粘贴到微信公众号正文编辑器,确认不是显示原始 HTML 文本,而是按富文本结构正常渲染,并确认当前排版主题的标题色、正文色、链接色、边框色和代码块背景已生效。

10.2 复制到知乎

  1. 导出符合知乎编辑器粘贴要求的富 HTML 片段,使用同一套 MarkdownHtmlClipboardExtensions 剪贴板写入能力。
  2. HTML 文档包含标题、编码声明、vex-copy-target=zhihu 元数据和 section#vex 片段。
  3. 内容应使用当前 Markdown、当前排版主题和紧凑布局;标题、段落、列表、引用、代码块、表格、链接和图片的关键样式必须 inline。
  4. 粘贴到知乎编辑器后不得显示原始 HTML 文本,且标题色、链接色、表格边框和代码块背景应跟随当前排版主题。

10.3 复制到稀土掘金

  1. 导出符合稀土掘金编辑器粘贴要求的富 HTML 片段,使用同一套 MarkdownHtmlClipboardExtensions 剪贴板写入能力。
  2. HTML 文档包含标题、编码声明、vex-copy-target=juejin 元数据和 section#vex 片段。
  3. 内容应使用当前 Markdown、当前排版主题和紧凑布局;标题、段落、列表、引用、代码块、表格、链接和图片的关键样式必须 inline。
  4. 掘金后缀文案也必须跟随当前主题的正文色和链接色,不允许保留固定蓝色/灰色模板色。
  5. 粘贴到稀土掘金编辑器后不得显示原始 HTML 文本,且主题样式应与 Vex 预览和 HTML/打印导出保持一致。

11. 导出与打印规格

11.1 HTML 导出

  1. 导出完整 HTML 文档。
  2. 包含标题、基础 CSS、编码声明。
  3. 内容应使用当前 Markdown。
  4. 文件名默认跟随当前文档名。
  5. 导出完成后状态栏显示文件名或路径。

11.2 PDF 导出

当前已支持可选择文本的分页 PDF 导出;成熟版本继续完善:

  1. 使用的渲染组件许可证与源码情况。
  2. 跨平台可用性。
  3. AOT、裁剪、Win7 兼容性影响。
  4. 字体、分页、图片、代码块、表格处理。

PDF 导出必须保留正文文本的选择和复制能力;后续继续优化复杂块级元素、分页、页眉页脚和排版主题映射。

图片等资源需要嵌入 PDF 文件;本地相对图、data:image、HTTP(S)、SVG/GIF/WebP 等图片源应统一解析或栅格化,通过邮件、QQ、微信等接收后也能正常预览格式和图片。

11.3 Word 导出

当前已支持 .docx 导出;成熟版本继续完善:

  1. 使用的渲染组件许可证与源码情况。
  2. 跨平台可用性。
  3. AOT、裁剪、Win7 兼容性影响。
  4. 字体、分页、图片、代码块、表格处理。

当前实现使用 OpenXML 包结构写入 Word 文档,支持基础标题、段落、列表、任务列表、引用、代码、分割线、表格、链接文本和图片嵌入;图片加载复用 CodeWF.Markdown,支持本地相对图、data:image、HTTP(S) 图片,并将 SVG/GIF/WebP 等必要格式转换为 PNG 后写入 .docx。后续继续完善编号样式、复杂 HTML、分页控制和更细的标书格式要求。

图片等资源需要嵌入 Word 文件,通过邮件、QQ、微信等接收后也能正常预览格式和图片,Word 格式规范,正常标书要求格式。

11.4 PNG 导出

当前已支持将当前文档导出为长图 PNG;成熟版本继续完善:

  1. 渲染区域。
  2. 图片尺寸与缩放。
  3. 长文档分页或长图策略。
  4. 跨平台图形后端兼容性。

11.5 打印

当前阶段:

  1. 生成临时 HTML 打印预览。
  2. 使用系统默认浏览器打开。

成熟版本:

  1. 支持原生打印对话框或稳定的跨平台打印方案。
  2. 支持页面边距、纸张大小、页眉页脚。
  3. 打印效果接近预览和 HTML 导出。

12. 主题、排版与视觉规格

12.1 视觉风格

  1. 整体风格克制、清爽、偏生产力工具。
  2. 不做营销式首页,不做大 Hero。
  3. 默认界面优先保证文字编辑效率和信息密度。
  4. 面板圆角不超过 8px,除非控件库主题有一致规范。
  5. 不使用无意义装饰图形、渐变球、背景光斑。

12.2 最小尺寸

主窗口最小尺寸要求:

  1. 宽度不小于 980。
  2. 高度不小于 640。
  3. 在最小尺寸下标题栏菜单、窗口按钮、状态栏徽标不能挤压错位。
  4. 状态栏右侧徽标必要时应压缩或隐藏低优先级项,不允许覆盖左侧状态文本。

12.3 深色模式

深色模式成熟要求:

  1. 标题栏、菜单、侧边栏、编辑器、预览、状态栏统一深色。
  2. 文本对比度足够。
  3. 代码块、链接、引用、表格样式可读。
  4. 输入框、按钮、浮层边框清晰。
  5. 不同主题都需要适配

12.4 字体

  1. 默认字体优先 Inter、Microsoft YaHei UI、Segoe UI。
  2. 编辑器等宽字体优先 Cascadia Mono、Consolas。
  3. 不使用随窗口宽度缩放的字体大小。
  4. 标题、面板、状态徽标字体大小应与容器匹配。

12.5 Markdown 排版主题色

  1. Markdown 排版主题色由 CodeWF.Markdown 提供,Vex 只通过 NuGet 使用,不在 Vex 内硬编码一套平行样式。
  2. 排版主题名称必须与 D:\temp_styles 中的 CSS 文件名一一对应,至少包含:简、橙心、墨黑、科技蓝、全栈蓝、兰青、姹紫、嫩青、山吹、极客黑、红绯、绿意、萌绿、蓝莹、蔷薇紫。
  3. 菜单显示名、配置保存值、CodeWF.Markdown 主题 ID 和实际样式不得错位、重名或缺项。
  4. 每个主题的主色、标题色、链接色、引用色、代码块背景、表格边框和根容器文字色应参考对应 CSS 文件前部样式实现。
  5. 主题切换后,Markdown 预览、HTML/打印导出、PNG/PDF 导出和“复制到公众号/知乎/稀土掘金”应使用同一套排版主题映射。
  6. 深色或高饱和主题要保证正文、代码块、链接、表格和引用在浅色/深色应用主题下都有足够对比度。

12.6 状态栏与界面细节

  1. 状态栏必须呈现专业桌面工具质感,避免临时标签、随机高饱和色块、过厚边框或与主题不一致的背景。
  2. 左侧状态文本应具备弹性宽度和省略策略,右侧保存状态、编码、缩放、行列、词数、字符数等徽标应对齐、等高、间距一致。
  3. 最小窗口宽度和长状态文本下,状态栏不得挤压主编辑区,不得让徽标覆盖文本;低优先级信息可以折叠或隐藏。
  4. 标题栏、侧边栏 Tab、文件列表、大纲、查找栏、浮层、菜单和状态栏需要一起做视觉检查,避免单个区域完成但整体观感割裂。
  5. 若后续确认存在关联 Vue 前端页面,按同样标准检查其状态栏、导航、表单、按钮、空状态和响应式布局;当前 Vex 桌面端至少完成主窗口和状态栏样式优化。

13. 快捷键规格

快捷键 行为
Ctrl+N 新建
Ctrl+O 打开
Ctrl+S 保存
Ctrl+Shift+S 另存为
Ctrl+P 打印
Ctrl+W 关闭当前文档
Alt+Enter 属性
Ctrl+F 查找
Ctrl+H 替换
F3 查找下一个
Esc 关闭查找栏或浮层
F11 全屏
Ctrl+0 实际大小
Ctrl+Plus 放大
Ctrl+Minus 缩小

注意:

  1. 编辑器自身应优先处理文本编辑快捷键。
  2. 窗口级快捷键不得破坏输入法和正常文本输入。
  3. 带文件选择器的快捷键应先标记事件已处理,再执行 async 操作。

14. 发布规格

14.1 发布目标

必须支持以下 RuntimeIdentifier:

  1. win-x64
  2. linux-x64
  3. linux-arm64
  4. osx-x64
  5. osx-arm64

14.2 发布 Profile

Vex 主工程必须包含 VS 可选择的 Folder Profile:

text
src/Vex/Properties/PublishProfiles/
  FolderProfile.Common.props
  FolderProfile__win-x64.pubxml
  FolderProfile__linux-x64.pubxml
  FolderProfile__linux-arm64.pubxml
  FolderProfile__osx-x64.pubxml
  FolderProfile__osx-arm64.pubxml

公共配置必须提取到 FolderProfile.Common.props,避免多个 pubxml 重复维护。

14.3 输出目录

发布产物统一输出到仓库根目录:

text
publish/<RuntimeIdentifier>/

例如:

text
publish/win-x64/
publish/linux-x64/
publish/linux-arm64/
publish/osx-x64/
publish/osx-arm64/

14.4 Windows 发布

  1. Windows 发布支持 Native AOT。
  2. Windows 运行目标支持 Win7。
  3. 必须使用 VC-LTL 与 YY-Thunks NuGet 包,避免 Win7 环境额外安装 VC 运行时。
  4. 发布后应在可用环境执行启动烟测。

14.5 Linux/macOS 发布

  1. 支持 self-contained single-file。
  2. 在 Windows 上发布非 Windows 平台时,非 AOT 也应启用 PublishTrimmed,以减少产品体积。
  3. 启用裁剪后必须维护免裁配置,避免目标平台运行异常。

macOS需生成.dmg.pkg.app等格式

14.6 裁剪免裁配置

Vex 必须维护:

text
src/Vex/Properties/Trimming/TrimmerRoots.xml

免裁内容至少覆盖:

  1. Vex 主程序集。
  2. Avalonia 核心与 XAML 加载相关程序集。
  3. Prism 与 DryIoc。
  4. ReactiveUI。
  5. CodeWF.EventBus。
  6. CodeWF.Markdown.Themes。
  7. Semi.Avalonia。
  8. Ursa.Avalonia。
  9. SVG、图片、字体和反射加载相关组件。

14.7 一键发布脚本

根目录必须提供:

text
publish_vex_all.bat

要求:

  1. 顺序发布所有 RID。
  2. 任一发布失败时返回非零退出码。
  3. 输出清晰,能看出当前发布 RID。
  4. 不删除用户未确认的文件。

15. 日志与文档规范

15.1 开发日志

文件:

text

要求:

  1. 完成一个小功能即记录。
  2. 同时记录中文和英文摘要。
  3. 记录关键验证动作,例如构建、截图、发布、漏洞扫描。
  4. 记录第三方许可证核查结论。

15.2 更新日志

文件:

text
UpdateLog.md

要求:

  1. 面向用户,简洁清楚。
  2. 当前只维护中文文档。
  3. 区分新增、优化、修复、删除、测试验证。
  4. 不写冗长实现细节。

中文推荐格式:

markdown
- 😄[新增]-描述用户可感知的新能力。
- 🔨[优化]-描述体验或工程优化。
- 🐛[修复]-描述已修复的问题。
- 🧪[测试]-描述完成的验证。
- ❌[删除]-删除功能说明

15.3 帮助文档

至少维护:

  1. 更新日志。
  2. 鸣谢。
  3. 后续增加用户手册、快捷键、导出说明。

16. 测试与验收

16.1 每次提交前必须执行

  1. dotnet build Vex.slnx -v:minimal
  2. git diff --check
  3. 涉及依赖变化时执行 dotnet list Vex.slnx package --vulnerable --include-transitive
  4. 涉及 UI 的改动必须启动桌面程序截图验证。
  5. 涉及发布配置的改动必须至少验证对应 publish profile 或一键发布脚本。

16.2 桌面截图验收

截图至少覆盖:

  1. 默认启动主窗口。
  2. 打开文件后的标题、编辑区、预览、状态栏。
  3. 打开文件夹后的文件列表和默认文档。
  4. 查找/替换栏。
  5. 字数统计面板。
  6. 属性面板。
  7. 关于面板。
  8. 删除确认面板。
  9. 源代码模式。
  10. 最小窗口尺寸。
  11. 不同主题、不同排版、不同语言排版。
  12. 文件列表右键菜单、重命名面板和外部文件变更自动刷新。
  13. 复杂 SVG 回归样例在浏览器与 Vex 预览中的对比。
  14. 新手引导在菜单项、TabItem、普通目标控件和状态栏上的箭头与高亮边框。
  15. 状态栏在最小宽度、长状态文本、浅色主题和深色主题下的显示。
  16. Markdown 排版主题色按 D:\temp_styles 全量或分批截图抽查。

截图检查项:

  1. 主界面是否空白或卡死,界面色彩搭配。
  2. 文本是否溢出。
  3. 控件是否重叠。
  4. 状态栏是否拥挤。
  5. 浮层是否居中、宽度是否合适。
  6. 预览是否正常渲染。
  7. SVG 图形、公众号复制样式和新手引导箭头是否存在明显缺失。
  8. 排版主题色是否与参考 CSS 名称和主色一致。

16.3 功能验收清单

成熟版本至少满足:

  1. 新建、打开、保存、另存为、关闭正常。
  2. 打开文件夹、文件列表、最近文件正常。
  3. 文件列表右键菜单的打开、重命名、打开文件位置、删除正常。
  4. 打开的文件被外部修改后,当前编辑区、预览和文件列表摘要自动刷新;存在未保存编辑时不得覆盖。
  5. 启动参数打开文件和文件夹正常。
  6. UTF-8、UTF-8 BOM、GB18030、Big5 重开正常。
  7. 编辑器常用快捷键、菜单动作正常。
  8. Markdown 预览实时更新。
  9. 大纲生成与点击跳转正常。
  10. 查找替换正常。
  11. 清除格式正常。
  12. 字数统计准确。
  13. 属性、关于、删除确认等浮层正常。
  14. HTML 导出正常。
  15. 打印预览正常。
  16. 主题、排版、语言切换正常。
  17. Windows AOT 发布正常。
  18. Linux/macOS single-file trimmed 发布正常。
  19. NuGet 漏洞扫描无未处理高危问题。
  20. 复杂 SVG 样例在 Vex 预览中不缺文字、菜单、气泡、按钮等关键元素。
  21. “复制到公众号/知乎/稀土掘金”剪贴板内容能在对应网页编辑器中以富文本方式正常渲染,并应用当前排版主题。
  22. 新手引导箭头清晰指向目标,目标控件高亮边框明显且不遮挡内容。
  23. 排版主题色名称与 D:\temp_styles 一一对应,预览、导出和复制路径一致。

17. 错误处理规格

必须处理并提示:

  1. 文件不存在。
  2. 文件无读取权限。
  3. 文件无写入权限。
  4. 编码读取失败。
  5. 保存失败。
  6. 删除失败。
  7. 重命名失败。
  8. 打开的文件被外部删除或暂时不可用。
  9. 导出失败。
  10. 打开官网或帮助文档失败。
  11. 最近文件失效。
  12. 发布或构建脚本失败。

提示策略:

  1. 轻量提示优先状态栏。
  2. 会影响数据安全的错误必须使用浮层或对话框。
  3. 错误信息要告诉用户发生了什么和下一步能做什么。
  4. 不向普通用户暴露完整异常堆栈;详细异常可进入日志。

18. 性能要求

18.1 启动

  1. 冷启动应尽量控制在桌面应用可接受范围。
  2. 初始化语言不应造成明显闪烁。
  3. 加载最近文件不应阻塞 UI。

18.2 编辑

  1. 10 万字符以内文档编辑应保持流畅。
  2. 预览、大纲、统计更新应节流或增量优化,避免每次按键造成明显卡顿。
  3. 查找替换大文档时应避免 UI 长时间无响应。

18.3 文件夹

  1. 文件夹扫描默认最多 300 个文档。
  2. 已支持后台扫描;后续增加加载进度。
  3. 超大目录应可取消或快速返回。

19. 可访问性与输入法

  1. 所有菜单项可键盘访问。
  2. 常用操作有快捷键。
  3. 输入法组合输入不得被窗口级快捷键破坏。
  4. 按钮和输入框应有清晰焦点样式。
  5. 深色模式下对比度足够。
  6. 状态信息不应只通过颜色表达。

20. 安全与数据保护

  1. 删除文件必须二次确认。
  2. 删除确认必须显示完整路径。
  3. 不自动覆盖用户文件。
  4. 未保存内容离开前必须提示保存。
  5. 临时导出文件应写入系统临时目录或用户选择路径。
  6. 不上传用户文档内容。
  7. 最近文件只保存本地路径,不保存文档内容。

21. AI 编程执行规范

AI 继续开发时必须遵守:

  1. 先读相关代码,再改文件。
  2. 每次只做一个清晰的小功能,功能完整后提交。
  3. 不在无关文件做格式化或大范围重排。
  4. 使用 apply_patch 修改文本文件。
  5. 不还原用户已有改动。
  6. 不创建第三方审计文档。
  7. 新增 NuGet 包前先查许可证、源码仓库、间接依赖。
  8. UI 改动后启动程序截图验证。
  9. 发布配置改动后执行对应发布验证。
  10. 每次提交前更新根目录 UpdateLog.md。
  11. Commit message 使用英文,例如 feat: add startup folder support。
  12. 提交后推送远端。

22. 推荐迭代路线

22.1 第一阶段:基础可用

  1. 应用框架、模块、主题接入。
  2. 标题栏菜单、三栏布局、状态栏。
  3. 新建、打开、保存、另存为。
  4. Markdown 编辑和实时预览。
  5. 文件夹列表和大纲。
  6. 最近文件。
  7. 基础快捷键。
  8. HTML 导出和打印预览。
  9. 发布 Profile 和一键发布脚本。

22.2 第二阶段:成熟编辑体验

  1. 未保存关闭确认。
  2. 查找替换增强。
  3. 编辑器语法高亮。
  4. 编辑器与预览滚动同步。
  5. 表格编辑辅助。
  6. 链接、图片、表格插入浮层。
  7. 拖放打开文件和文件夹。
  8. 自动保存草稿和崩溃恢复。
  9. 用户设置持久化。
  10. CodeWF.Markdown 可编辑预览控件原型。
  11. Vex 可视化编辑模式:默认隐藏源码编辑器,预览区可直接编辑。

22.3 第三阶段:成熟发布体验

  1. 复制到公众号
  2. 复制到知乎
  3. 复制到稀土掘金
  4. PDF 导出。
  5. Word 导出。
  6. PNG 导出。
  7. 原生打印。
  8. 深色模式完善。
  9. 多语言完整覆盖。
  10. 安装包或压缩包发布。
  11. 自动更新策略。
  12. 性能优化和大文件体验。

23. 当前已实现能力快照

截至本文档更新时,仓库已具备以下能力,后续实现应避免重复造轮子:

  1. .slnx 解决方案。
  2. Avalonia + Prism + DryIoc + ReactiveUI 基础框架。
  3. CodeWF.EventBus 默认单例和 [EventHandler] 通信模式。
  4. Semi.Avalonia、Ursa、Avalonia.Themes.Fluent 主题接入。
  5. 标题栏菜单、三栏布局、状态栏。
  6. 新建、打开、打开文件夹、保存、另存为、删除确认。
  7. 最近文件、快速打开、关闭当前文档。
  8. 启动参数打开文件和文件夹。
  9. 编码重开。
  10. Markdown 编辑、预览、大纲、统计。
  11. 查找替换栏。
  12. 清除 Markdown 格式。
  13. HTML 导出和 HTML 打印预览。
  14. 字数统计、关于、属性等浮层。
  15. 常用桌面快捷键。
  16. Windows、Linux、macOS 发布 Profile 与一键发布脚本。
  17. 裁剪免裁配置。
  18. 中英文更新日志与开发日志。
  19. UrsaWindow 主窗口、标题栏菜单、状态栏、查找栏、文件页签和大纲页签已拆分为独立 View。
  20. 侧边栏 TabControl 已通过 Prism Region 注入文件和大纲页签。
  21. Shell 主要子模块通过 Prism IoC 和 CodeWF.EventBus 解耦通信。
  22. 初步 i18n/l10n 资源已接入,后续需继续迁移剩余硬编码文案。
  23. 未保存内容离开前保存确认。
  24. 查找栏自动聚焦和搜索结果计数。
  25. 编辑器语法高亮、当前行高亮、行号和 Tab 缩进。
  26. 拖放打开文件和文件夹。
  27. 用户设置通过 App.config 持久化窗口、布局、主题、语言和编辑器显示状态。
  28. 深色模式已覆盖标题栏、侧栏、编辑器、预览区、状态栏和状态徽标。
  29. 编辑器光标移动时,预览区按文档位置同步滚动。
  30. 表格、链接、图片支持上下文感知插入:URL、图片路径和 CSV/TSV/管道分隔文本可自动生成对应 Markdown。
  31. 预览区可基于 CodeWF.Markdown 源码行定位精确滚动,失败时回退比例滚动。
  32. 直接打开单个文件时,左侧文件列表会同步加载该文件所在目录的 Markdown/txt 文档。
  33. 自动保存草稿和崩溃恢复。
  34. Semi 主题色菜单支持跟随系统、浅色、深色、水生、沙漠、黄昏、夜空。
  35. Markdown 排版菜单已补齐 CodeWF.Markdown.Themes 内置排版主题。
  36. 文件夹打开已改为后台扫描,并跳过无权限目录或读取失败的文件摘要。
  37. 文件打开、文件夹加载、保存、删除、导出、打印、帮助和系统打开失败时显示错误提示浮层;属性、统计和删除确认已迁移为 UrsaWindow 对话框。
  38. 文件列表右键菜单支持打开、重命名、打开文件位置和删除,当前打开文件重命名后同步更新标题、文件列表和最近文件。
  39. 当前打开的 Markdown/txt 文件支持外部变更监听,磁盘内容变化后自动刷新编辑区、预览和文件列表摘要;有未保存编辑时只提示不覆盖。
  40. 查找/替换栏支持区分大小写、整词匹配、正则匹配、搜索结果计数和循环搜索提示。
  41. 导出菜单支持 HTML、PNG、Word 和 PDF;PDF 正文当前可选择复制,后续继续完善分页断点和复杂块级元素精细排版。
  42. 新手引导覆盖关键菜单、文档列表、大纲、编辑区、预览区和状态栏,且可从帮助菜单再次打开。
  43. 深色模式已进一步覆盖查找栏、统计/关于/属性/删除对话框、未保存确认和错误浮层。
  44. 帮助菜单的内置文档统一使用简体中文文件名,快速开始和鸣谢文档会随程序输出。
  45. Markdown 预览按当前文档路径解析相对图片,常规图片、基础 SVG 和 GIF 已有预览/导出支持;复杂 SVG 渲染缺失按 24.1 作为近期修复项。
  46. 新手引导 Guide 的边缘对齐位置已通过本地 CodeWF.AvaloniaControls 修正,文件菜单等靠边步骤不再越界;箭头显著性和目标粗边框按 24.4 继续增强。
  47. 编辑器普通回车支持智能换行,可延续缩进、引用、无序列表、有序列表和任务列表,空列表项回车会结束列表。
  48. PDF 导出页眉会显示文档标题,页脚会显示当前文件名和页码,并为元数据区域预留页面空间;分页切片优先选择连续空白带作为断点。
  49. HTML 打印预览提供屏幕工具条,可在自动打印被拦截时手动重试打印或关闭预览,正式打印时工具条隐藏。
  50. 文件重命名失败详情已覆盖四套 i18n 文案,包括空文件名、非法字符、重名和不支持扩展名等边界提示。
  51. 帮助文档缺失错误详情已覆盖四套 i18n 文案。
  52. Folder Publish Profile 不会自动删除 publish/<RID>/ 中已有文件,避免清理用户未确认的发布产物。
  53. 正式压缩包发布产物已有 scripts/package_vex_artifacts.ps1,可生成 zip、SHA256 与 release manifest;publish_vex_all.bat --package 可在全部 RID 发布成功后自动打包。
  54. PDF/PNG 导出渲染失败详情继续迁移到四套 i18n 文案,覆盖 PDF 创建、位图解码和 SVG 栅格化关键失败路径。
  55. 关于窗口链接和 Shell 浮层遮罩已改用主题资源,暗色主题下链接颜色与遮罩强度单独配置。
  56. 预览滚动比例改用编辑器维护的行数,减少大文件中光标移动触发的全量 Markdown 扫描。
  57. 当前文档无文件路径的重载失败详情已迁移到四套 i18n 文案。
  58. 更新日志帮助文档补齐繁体中文与日文摘要文件,并纳入构建/发布输出。
  59. 打印预览临时 HTML 文件名会清理非法字符并限制长度,避免特殊文档名导致预览文件创建失败。
  60. 发布打包脚本会在压缩前预检 manifest、发布目录和目标产物冲突,避免失败时留下部分压缩包。
  61. Markdown 统计正文词数/字符数改为单次字符扫描,减少大文件统计时的临时字符串与正则匹配分配。
  62. README 已记录构建、一键发布和压缩包打包命令,方便生成 artifacts/release/ 正式压缩包产物。
  63. 系统 Shell 未能启动打印预览浏览器时会显示本地化错误详情,不再误报预览已打开。
  64. 发布打包脚本支持逗号分隔 RID 参数,手动指定多个 RID 时会规范化为多个运行时目标。
  65. Markdown 大纲扫描改用手写 ATX 标题解析,减少长文档逐行正则匹配开销。
  66. 帮助文档统一回退到简体中文文档,避免继续维护多语言文档副本。
  67. Markdown 统计的行数、段落、标题和横线统计合并为单次字符扫描,减少大文件逐行正则匹配开销。
  68. HTML/打印、PNG 与 PDF 导出会读取当前 Markdown 排版主题和紧凑布局,并通过共享导出样式映射应用颜色与字号;PDF 正文输出为可选择、可复制文本。
  69. 打印预览工具条支持纸张、边距和页眉页脚开关,正式打印时可固定显示文档标题页眉和文件页脚,并通过动态 @page 应用设置。
  70. 帮助文档在 zh-TW、zh-HK、zh-MO 等传统中文区域优先回退繁体中文文档,再回退简体中文。
  71. Windows MSIX 打包脚本 scripts/package_vex_msix.ps1 已具备:从 publish/<RID>/ 生成 full-trust MSIX 布局、写入 AppxManifest.xml、补齐 logo 资产、调用 Windows SDK makeappx.exe 打包,并可选用 signtool.exe 签名。
  72. 标题菜单已补充暗色主题下的动态前景、悬停和选中态颜色;主题色、排版主题和语言菜单会显示 Radio 勾选,紧凑布局会显示 CheckBox 勾选。
  73. 大文件连续输入时,未保存状态和草稿排队会立即更新,预览文档状态、统计和大纲构建合并到 220ms 防抖刷新,减少每字符触发的全量 Markdown 派生扫描。
  74. 查找栏全文匹配计数已改为 180ms 防抖,打开查找/替换面板时仍立即计数,关闭面板会取消挂起计数,减少长文档连续输入搜索词时的重复全文扫描。
  75. 查找 Count 路径会在单次扫描中直接计算总命中数和当前命中索引,不再为所有命中分配 SearchMatch 列表;Find/Replace 路径仍保留完整命中信息。
  76. PDF 页面背景、页眉页脚元数据颜色和分页策略会读取当前 MarkdownExportStyle;暗色排版主题不再按白底假设处理页面样式。
  77. 替换下一个和全部替换会使用 AvaloniaEdit 文档级 Replace 更新内容,避免单次替换也通过整篇字符串重设编辑器文本。
  78. 打开文件夹时会先取前 300 个支持的 Markdown/txt 文件,再对这批文件排序展示,避免大目录为了列表上限先排序全部匹配文件。
  79. HTML 打印预览的屏幕工具条、表单控件、页眉页脚、打印背景和链接色会读取当前 MarkdownExportStyle,并补充图片、列表项、表格行等打印断页保护,暗色排版主题下预览与打印视觉更一致。
  80. 左侧文件列表摘要生成改为有界流式扫描:最多读取前 8 行、4096 个字符,单行最多保留 512 个字符再生成 96 字符摘要,避免超长单行文件拖慢文件夹加载。
  81. 帮助菜单未知或空 topic 的状态栏排期提示和错误上下文已移除固定英文 Help 兜底,空 topic 会复用当前语言的帮助菜单文案。
  82. MSIX PrepareOnly 准备布局不再被已存在的目标 .msix 包文件阻塞;包文件覆盖检查只在真实打包时执行,并已通过临时发布目录 smoke 验证。
  83. 普通 TextBlock 默认前景色和右键 ContextMenu 背景、边框、菜单前景、悬停态已接入 Vex 动态主题资源,减少暗色模式下文本和弹出菜单边界的浅色默认回退。
  84. Markdown 大纲扫描改为 ReadOnlySpan<char> 逐行解析,不再为每一行分配字符串;只有命中标题才创建标题文本,并会跳过反引号与波浪线代码围栏。
  85. PNG/PDF 导出会识别任务列表状态,将 - [ ] 与 - [x] 渲染为 [ ]/[x] marker,减少复杂块级元素映射缺口。
  86. HTML/打印/复制与 PNG/PDF/Word 导出解析本地图片时会同时尝试原始路径和 URL 解码路径,带空格等需编码的相对图片文件名不再容易导出缺图。
  87. 繁体中文与日文更新日志摘要已刷新到最近的导出、性能、暗色主题和 MSIX 打包改动,并继续随主项目复制到输出目录。
  88. 大纲、PDF 页眉和 HTML 打印预览标题共用 MarkdownHeadingScanner span 扫描器,会跳过反引号/波浪线代码围栏内的示例标题,并支持 3 空格以内缩进的 ATX 标题。
  89. PNG/PDF 导出的表格单元格会渲染段落 inline,保留粗体、斜体、删除线、行内代码和链接样式,不再全部压平成纯文本。
  90. 无路径且无文件名的文档导出时,HTML 打印预览和 PDF 页眉页脚兜底标题会读取 DocumentDefaultFileName/DocumentDefaultHeading 资源,不再在导出路径硬编码 Untitled.md。
  91. scripts/stress_vex_markdown_services.ps1 已补充真实大文件压测入口,默认 120,000 行生成约 10.3M 字符 Markdown,并验证大纲扫描约 154ms、统计扫描约 498ms。
  92. 属性、字数统计和删除确认已使用 UrsaWindow 对话框;长名称、长路径和错误详情等文本可选择复制。
  93. 查找和替换输入框限制为 200 字符并强制单行显示,避免粘贴超长内容破坏布局。
  94. 导出 HTML、PDF、PNG、Word 成功后会打开保存目录并定位文件;PDF/PNG/Word 导出已复用 CodeWF.Markdown 图片加载和栅格化能力,支持本地相对图、data:image、HTTP(S)、SVG/GIF/WebP,并确保 PDF 正文可选择复制、PDF 与 Word 文件可离线查看嵌入图片。
  95. 复制到公众号、知乎、稀土掘金会通过 CodeWF.Markdown.MarkdownHtmlClipboardExtensions 写入富 HTML 剪贴板内容,工具名、网站和尾注文案读取 CodeWF.Markdown 多语言资源,并把当前 MarkdownExportStyle 的主题色、字号、边框、代码块背景和掘金尾注样式内联到片段中。
  96. 从网页复制内容后粘贴到中间编辑器时,Vex 会优先读取 text/html、public.html 或 Windows HTML Format,调用 CodeWF.Markdown.MarkdownHtmlClipboard.Html2Markdown(htmlContent) 转为 Markdown;没有 HTML 或转换失败时回落到 AvaloniaEdit 原生粘贴。

24. 近期修复需求(来自 D:\r.md)

以下事项优先级高于常规迭代路线。参考 SVG、截图和 CSS 文件只用于分析与验收,不得直接改动;涉及 CodeWF 依赖库时,必须先在依赖库本地打包 NuGet,再由 Vex 引用验证,验证通过前不要提交 Vex 或依赖库仓库。

24.1 CodeWF.Markdown 复杂 SVG 渲染完整性

问题样例:

  1. SVG 文件:D:\wwwroot\img1.dotnet9.com\2026\05\codewf-avalonia-guide-cover.svg。
  2. 浏览器正确效果:D:\temp_imgs\1212.png。
  3. Vex 当前缺失效果:D:\temp_imgs\2121.png,主要表现为只显示背景、遮罩或局部元素,标题、菜单、引导气泡、按钮等关键内容缺失。

实现要求:

  1. 优先在 D:\github\CodeWF.Markdown 修复 MarkdownViewer 或其 SVG 图片渲染实现,不修改 SVG 样例文件本身。
  2. 支持常见复杂 SVG 能力,包括文本、嵌套分组、渐变、裁剪、遮罩、滤镜、透明度和 viewBox 缩放。
  3. 修复后 Vex 预览、HTML/打印、PNG/PDF 导出、Word 导出和复制路径中的 SVG 处理策略应保持一致;无法共享实现时必须记录差异。
  4. 回归验收必须同时截图浏览器参考与 Vex 预览,确认关键文本、菜单、气泡、按钮、底部标签和背景都完整可见。

24.2 CodeWF.Markdown 排版主题色修正

参考目录:D:\temp_styles。

必须一一对应的主题名:

  1. 简。
  2. 橙心。
  3. 墨黑。
  4. 科技蓝。
  5. 全栈蓝。
  6. 兰青。
  7. 姹紫。
  8. 嫩青。
  9. 山吹。
  10. 极客黑。
  11. 红绯。
  12. 绿意。
  13. 萌绿。
  14. 蓝莹。
  15. 蔷薇紫。

验收要求:

  1. CodeWF.Markdown 内置主题、Vex 菜单显示名、配置保存值和实际 CSS/样式映射完全一致。
  2. 每个主题至少校验根文字色、标题色、链接色、引用色、代码块背景、表格边框、强调色和背景色。
  3. Vex 切换排版主题后,预览、HTML/打印、PNG/PDF 导出和复制到公众号/知乎/稀土掘金使用同一主题结果。
  4. 如果某个参考 CSS 中存在 Vex 当前不支持的样式能力,应记录降级策略,不能静默换成其他主题。

24.3 复制到自媒体富 HTML

问题:当前“复制到公众号/知乎/稀土掘金”必须在对应网页编辑器中正常粘贴为富文本,不能只复制 Markdown 原文,也不能把 HTML 片段当普通文本显示。

实现要求:

  1. Vex 菜单动作负责把当前 Markdown、排版主题和目标平台交给 CodeWF.Markdown.MarkdownHtmlClipboardExtensions,由公共库生成目标平台可粘贴的 HTML 片段并写入剪贴板富 HTML 格式。
  2. HTML 生成应复用当前 MarkdownExportStyle,避免 Vex 另写一套不一致的样式;三平台都必须读取当前排版主题和紧凑布局。
  3. 根节点使用 section#vex,携带 data-tool、data-website 和 inline style;标题、段落、列表、表格、代码块、图片等节点也应内联关键样式。
  4. Windows HTML Format 必须使用 UTF-8 CF_HTML 字节载荷并正确计算片段偏移;text/html 和 macOS public.html 也应同时写入。
  5. 粘贴到微信公众号、知乎或稀土掘金正文编辑器后应直接显示富文本排版,而不是显示 Markdown 或原始 HTML 文本。
  6. 掘金尾注、知乎/掘金的二级标题结构和公众号基础结构可保留平台差异,但颜色、字号、边框、代码背景和链接样式必须跟随当前主题。

24.4 CodeWF.AvaloniaControls 新手引导箭头增强

问题:目标控件与引导气泡之间的三角指示不够明显,目标控件框选效果也需要更强。

实现要求:

  1. 在 D:\github\CodeWF.AvaloniaControls 修复 Guide 控件实现。
  2. 三角箭头应根据气泡位置自动贴合目标方向,具有清晰填充色、边框或阴影,不被遮罩覆盖。
  3. 目标控件高亮边框应比当前更醒目,浅色、深色和高对比主题下都能识别。
  4. 对菜单项、Popup、TabItem、状态栏、编辑区、预览区等目标分别截图验收。

24.5 Vex 界面视觉质量专项

第 5 条原始记录写作“Vue 界面优化”;若目标确为关联 Vue 页面,需先补充仓库路径。当前 Vex 仓库先按桌面端主界面视觉质量专项处理。

要求:

  1. 优先检查状态栏,因为它当前最容易暴露“不专业”的视觉问题。
  2. 同步检查标题栏菜单、侧边栏、文件列表、大纲、查找栏、浮层、右键菜单和预览区边界。
  3. 重点修正间距、对齐、字号、颜色层级、边框、圆角、悬停态、选中态、禁用态和深色模式对比度。
  4. 验收以截图为准,至少覆盖默认窗口、最小窗口、浅色主题、深色主题、长状态文本和打开文件后的真实状态栏内容。

25. 未完成重点清单

优先补齐:

  1. CodeWF.Markdown 复杂 SVG 渲染完整性:按 D:\wwwroot\img1.dotnet9.com\2026\05\codewf-avalonia-guide-cover.svg 回归样例修复 Vex 预览缺失。
  2. CodeWF.Markdown 排版主题色修正:与 D:\temp_styles 的 15 个 CSS 主题名称和主色一一对应。
  3. 复制到自媒体富 HTML:剪贴板写入微信公众号、知乎、稀土掘金可正常渲染的 HTML 片段,而不是 Markdown 原文或原始 HTML 文本。
  4. CodeWF.AvaloniaControls Guide 箭头增强:三角指示明显,目标控件粗边框清晰,Vex 使用本地 NuGet 包验证。
  5. Vex 界面视觉质量专项:优先优化状态栏,并覆盖标题栏、侧边栏、查找栏、浮层和右键菜单。
  6. PDF 导出成熟化:正文文本已可选择复制,继续补齐更复杂块级元素的排版映射;任务列表状态、表格单元格 inline 样式和图片嵌入已纳入 PNG/PDF 导出,Word 图片嵌入也已共用 CodeWF.Markdown 图片处理链路。
  7. 原生打印或继续完善系统打印流程;当前 HTML 打印预览已具备主题化工具条、纸张/边距/页眉页脚控制、更稳定的打印 CSS,以及与 PDF/大纲一致的标题解析。
  8. 深色模式细节完善:继续验证排版主题内容区域对比度;普通文本和右键菜单弹出边界已接入 Vex 动态主题资源。
  9. I18n 文案完整迁移:继续补齐剩余边界提示;繁体中文/日文更新日志摘要、帮助菜单空 topic 英文兜底、打印/PDF 默认文件名兜底已更新。
  10. 大文件性能优化:继续补充 UI 级真实超大文件压测;服务级压测脚本已覆盖 120,000 行 Markdown,大纲/PDF/打印标题扫描已有共享 span 逐行扫描,文件摘要边界已有有界流式扫描保护。
  11. 安装包成熟化:MSIX 真实签名/安装验证和 MSI 方案按需补齐;压缩包发布产物、MSIX 布局/打包脚本与 PrepareOnly 冲突边界 smoke 已具备。
  12. CodeWF.Markdown 可编辑预览控件与 Vex 可视化编辑模式。