Vex Markdown 编辑器需求规格说明书
1. 文档目标
本文档用于指导 AI 或工程师持续开发 Vex,使其从基础 Markdown 编辑器逐步成长为成熟、稳定、可发布的桌面产品。实现时应把本文档视为产品规格、架构约束、验收清单和迭代路线图的统一来源。
任何新增功能都必须满足以下原则:
- 先理解现有代码结构,再按现有模块边界最小改动。
- 每完成一个可独立体验的小功能,都要构建验证、必要时截图验证,并更新开发日志与中英文更新日志。
- 提交信息使用英文规范化提交,并推送到远端。
- 不为了赶功能牺牲桌面产品体验。文本不能溢出,控件不能互相遮挡,布局在最小窗口尺寸下仍可用。
- 不新增来源不清楚、源码不可查或许可证不合规的第三方组件。
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 用户目标
- 快速新建、打开、编辑、保存 Markdown 文档。
- 在源码编辑与实时预览之间自由切换。
- 通过文件夹视图管理一组 Markdown 文档。
- 通过大纲快速定位标题。
- 通过菜单、快捷键和右键操作高效完成格式化、查找替换、导出和打印。
- 使用合适的主题、排版和语言环境,长时间写作不疲劳。
- 在 Windows、Linux、macOS 上获得一致的核心体验。
3.2 体验原则
- 打开即写:启动后光标应能快速进入编辑区,默认文档不制造无意义干扰。
- 状态明确:窗口标题、状态栏和属性面板都要反映当前文件名、保存状态、编码和路径。
- 操作可逆:删除、关闭有未保存内容、覆盖保存等风险操作必须有确认或保护。
- 快捷键优先:高频操作必须支持桌面常见快捷键。
- 预览可信:编辑区与预览区应尽量同步,导出 HTML/PDF/PNG 的视觉结果应接近预览。
- 文件安全:保存、另存为、编码重开、删除、导出不得造成数据丢失或路径误判。
4. 技术栈与硬性约束
4.1 框架
- 解决方案使用
.slnx。 - 主程序使用 Avalonia 最新规范开发,目标框架使用当前仓库配置。
- 模块化使用 Prism 8.x 与 DryIoc。
- ViewModel 使用 ReactiveUI。
- UI 绑定命令优先直接绑定 ViewModel 的 public 方法,方法可为同步或 async。
- 编辑器、模块、View、ViewModel 间的业务消息使用 CodeWF.EventBus。
- View 拆分必须有明确职责,不用 partial 伪拆分;单个
.axaml或.cs超过约 500-600 行时应优先拆成独立 UserControl、ViewModel 或服务,文件代码行数不是硬性规定,优先保证业务逻辑清晰,其次代码优雅、可读性好。 - Prism IoC、AutoWireViewModel 和 Region 应优先用于模块组合;TabControl、内容区等可扩展区域不应长期硬编码页面。
- ViewModel 之间避免强耦合,跨模块动作优先通过 CodeWF.EventBus 消息表达。
.axaml.cs只保留必须由 View 承担的控件事件、窗口生命周期和平台交互,业务操作放入 ViewModel 或服务。
4.2 UI 库与主题
- 主 UI 使用 Semi.Avalonia 与 Ursa.Avalonia NuGet 包,支持Semi的所有主题(跟随系统、浅色模式、深色模式、水生、沙漠、黄昏、夜空等),参考用法
https://github.com/dotnet9/CodeWF.Toolbox/tree/develop,本地对应仓库目录D:\github\apps\CodeWF.Toolbox,尽量使用Ursa的控件,包括他的UrsaWindow做为窗体基类。 - Markdown 排版主题使用参考
https://github.com/dotnet9/CodeWF.Markdown,本地对应仓库目录D:\github\CodeWF.Markdown,完整支持10几种排版主题。 - Avalonia.Themes.Fluent 允许保留,用于 AvaloniaEdit 适配和必要的基础主题补充。
- 不使用无源码仓库、许可证不可查或黑盒的 AvaloniaEdit 第三方主题包。
- 主题资源应拆分到
Vex.Controls与Vex.Controls.Themes,按 Semi.Avalonia 风格组织。 - 所有窗口必须继承 Ursa
UrsaWindow,不要自绘标题栏控制按钮或重复实现 Ursa 已提供的窗口能力。
4.3 CodeWF 依赖
- CodeWF.EventBus、CodeWF.Markdown、CodeWF.Markdown.Themes、CodeWF.AvaloniaControls 等通过 NuGet 包安装使用,不通过项目引用直接引用。
- 如果 CodeWF 系列库存在问题,可直接修改对应仓库,本地打包后在 Vex 中使用,验证通过后再发布 NuGet;当前重点依赖仓库为
D:\github\CodeWF.Markdown与D:\github\CodeWF.AvaloniaControls。 - 修改 CodeWF 依赖库时,先在依赖库本地打包 NuGet,再更新 Vex 引用到本地包验证;验证通过前不要提交 Vex 或依赖库仓库。
- CodeWF.EventBus 统一直接使用
CodeWF.EventBus.EventBus.Default,不通过 IOC 注册或构造函数注入事件总线。 - Command、Query、Notification 等消息仍归 CodeWF.EventBus 管理,不使用 Prism 命令或事件替代。
- 不使用显式
Subscribe(Action<TCommand>)这类写法。 - 推荐模式:ViewModel 或服务中声明
[EventHandler]处理方法,并在构造函数通过Subscribe(this)注册。 - 不使用 CodeWF.DryIoc.EventBus 包;能放在 ViewModel 或已有服务的处理函数应直接放在对应对象内。
4.4 第三方组件合规
新增任何第三方开源组件前必须执行:
- 查询组件许可证,优先 MIT、Apache-2.0、BSD。
- 查询源码仓库,确认源码开放且可追溯。
- 穿透检查直接依赖与间接依赖,确认没有明显不合规或黑盒组件。
- GPL、AGPL、商业闭源、不明许可证等必须先与项目负责人讨论。
- 不创建单独的第三方审计文档;必要的许可证核查结果记录在开发日志或提交说明中即可。
5. 主窗口布局
5.1 框架布局
基于UrsaWindow的主窗口采用四行布局:
- 标题栏:Logo、产品名、标题栏菜单、当前文件名、窗口控制按钮。
- 查找/替换栏:按需显示,不常驻。
- 工作区:左侧文件/大纲、中间编辑器、右侧预览。
- 状态栏:状态文本、保存状态、编码、缩放、行列、词数、字符数。
菜单必须放在标题栏内,不额外占用客户区,当前文件名挨着菜单后摆放。
5.2 左侧侧边栏
- 使用 TabControl,包含“文件”和“大纲”两个 Tab。
- 文件 Tab 显示当前打开文件(夹)内的文件名,注意直接打开的文件也需要列在该TabItem内。
- 文件列表项展示文件名以及部分文件内容(截取前20个字符)。
- 文件列表为空时显示空状态,不显示空白列表。
- 文件列表右键菜单支持打开、重命名、打开文件位置和删除。
- 文件列表支持对 Markdown/txt 文件重命名,重命名后同步更新列表、标题、最近文件和当前打开文档路径。
- 大纲 Tab 根据当前 Markdown 标题生成,点击后跳转编辑器对应行。
- 无标题时显示空状态。
- 视图菜单中的“文档列表”和“大纲”必须自动展开侧边栏并切换到对应 Tab。
5.3 编辑器区域
- 使用 AvaloniaEdit 作为源码编辑器。
- 支持 UTF-8、UTF-8 BOM、GB18030、Big5 重新打开。
- 支持常用编辑操作:撤销、重做、剪切、复制、粘贴、全选。
- 支持插入或切换 Markdown 标记:标题、段落、表格、代码块、公式块、引用、有序列表、无序列表、任务列表、分割线、加粗、斜体、行内代码、链接、图像。
- 支持清除常见 Markdown 格式。
- 支持查找、查找下一个、替换下一个、全部替换。
- 支持行列状态同步。
- 支持缩放字体大小。
- 已支持语法高亮、当前行高亮、行号、Tab 行为、拖放打开文件和回车智能缩进;后续继续完善括号匹配等编辑细节。
- 支持网页 HTML 粘贴为 Markdown:场景是复制网页内容后粘贴到中间编辑器,编辑器应优先读取剪贴板 HTML,并通过
CodeWF.Markdown公共转换能力自动转成 Markdown 后插入;没有 HTML 或转换失败时回落到普通文本粘贴。转换操作封装在 CodeWF.Markdown 控件库中,API 为:
string Html2Markdown(string htmlContent);5.4 预览区域
- 使用 CodeWF.Markdown.Themes(引入了CodeWF.Markdown) 提供的 MarkdownViewer。
- 预览内容跟随当前 Markdown 实时更新。
- 支持排版主题切换(参考
CodeWF.Markdown.Sample)。 - 支持紧凑布局切换(参考
CodeWF.Markdown.Sample)。 - 预览滚动条显示。
- 源代码模式下临时隐藏预览和侧边栏,退出时恢复原布局状态。
- 支持编辑器与预览滚动同步;本地与相对路径图片应按当前文档目录解析,SVG 正常渲染,GIF 可播放;后续继续完善链接点击策略。
- 复杂 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 浮层与对话体验
当前窗口内浮层包括:
- 字数统计面板。
- 关于面板。
- 属性面板。
- 删除确认面板。
- 未保存确认面板。
- 错误提示面板。
- 文件重命名面板。
规则:
- 浮层宽度、内边距、边框、圆角保持一致。
- 信息型浮层不遮挡状态栏关键反馈。
- 删除确认必须显示文件名和完整路径,并明确永久删除;重命名面板必须显示原路径。
Esc应关闭信息型浮层;在删除确认中Esc等同取消。- 浮层按钮文本不得溢出。
5.6 新手引导
新手引导使用 CodeWF.AvaloniaControls 的 Guide 控件。成熟要求:
- 步骤气泡、遮罩、高亮目标和箭头在浅色、深色及 Semi 主题色下都要清楚可辨。
- 目标控件与引导气泡之间必须显示明显的三角指示,参考
D:\temp_imgs\1212.png;不得出现箭头消失、方向错误、被遮罩吞掉或与气泡边缘融在一起。 - 当前步骤的目标控件应有足够醒目的高亮边框,边框厚度至少 2px 或达到同等视觉强调效果,不遮挡目标控件文字和图标。
- 靠近窗口边缘、菜单弹层、TabItem、状态栏等目标不得导致气泡越界,箭头仍应指向真实目标中心或最近可见边缘。
- 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-6。
- 表格。
- 代码块。
- 公式块。
- 引用。
- 有序列表。
- 无序列表。
- 任务列表。
- 水平分割线。
行为要求:
- 如果有选区,对选区应用格式。
- 如果无选区,对当前行或插入点应用格式。
- 再次触发可尽量保持幂等,不重复堆叠无意义标记。
- 操作后焦点回到编辑器。
6.4 格式菜单
必须支持:
- 加粗。
- 斜体。
- 行内代码。
- 链接。
- 图像。
- 清除样式。
验收标准:
- 选中文本加粗后变为
**文本**。 - 选中文本斜体后变为
*文本*。 - 清除样式可移除常见 Markdown 标记,不破坏普通文本。
6.5 视图菜单
| 菜单项 | 快捷键 | 行为 |
|---|---|---|
| 显示/隐藏侧边栏 | 切换侧边栏 | |
| 大纲 | 展开侧边栏并切换到大纲 | |
| 文档列表 | 展开侧边栏并切换到文件 | |
| 搜索 | Ctrl+F | 显示查找栏 |
| 源代码模式 | 隐藏侧边栏和预览,再次切换恢复原布局 | |
| 显示源码编辑器 | 在可视化编辑模式下显示或隐藏中间源码编辑器 | |
| 显示状态栏 | 切换状态栏 | |
| 字数统计窗口 | 打开统计浮层 | |
| 切换全屏 | F11 | 切换 FullScreen |
| 保持窗口在最前端 | 切换 Topmost | |
| 实际大小 | Ctrl+0 | 缩放回 100% |
| 放大 | Ctrl+Plus | 编辑器字体放大 |
| 缩小 | Ctrl+Minus | 编辑器字体缩小 |
6.6 主题菜单
帮助菜单直接展示以下主题相关入口,不再额外包一层“主题”子菜单:
- 主题色:跟随系统、浅色模式、深色模式、水生、沙漠、黄昏、夜空等,配置项为空时,默认跟随系统。
- 排版:迁移 CodeWF.Markdown.Sample 中的排版主题,如数迁移,多达15种+,例如简洁、Basic、橙心、墨黑、科技蓝,默认简洁。
- 紧凑布局。
要求:
- 主题切换应立即生效,并保存配置项,重启后使用配置项加载主题。
- 主题色影响窗口基础背景、菜单、边框、面板、编辑器和预览。
- 排版主题影响 Markdown 预览,修改时保存配置项,启动后使用配置项加载排版主题。
- 紧凑布局影响预览字体、间距和编辑体验。
- 菜单项应显示当前选择状态,并持久化用户选择。
6.7 国际化菜单
语言至少包含:
- 简体中文
zh-CN。 - 繁体中文
zh-Hant。 - English
en-US。 - 日本語
ja-JP。
要求:
- 第一次启动,配置项语言为空,根据操作系统语言实现l10n,即支持本地化,缺省显示英文。
- 后续启动,根据配置项语言切换当前显示语言,不存在则缺省显示英文。
- 初始化语言不应在状态栏显示“语言切换成功”一类误导提示。
- 用户主动切换语言时应更新菜单、浮层、状态提示和帮助文案,更新配置项语言。
- 新增 UI 文案应同步维护 I18n 资源。
6.8 帮助菜单
| 菜单项 | 行为 |
|---|---|
| 更新日志 | 弹出更新日志对话框,使用 MarkdownViewer 加载内置 UpdateLog.md |
| 鸣谢 | 弹出鸣谢对话框,使用 MarkdownViewer 加载内置 鸣谢.md |
| 官方网站 | 打开 https://codewf.com |
| 反馈 | 打开反馈入口,未确定前可打开官网 |
| 关于 | 打开关于面板 |
弹出的对话框皆基于Ursa的UrsaWindow。
关于面板必须展示:
- Vex。
- 中文名“维刻”。
- Slogan。
- 作者“沙漠尽头的狼”。
- CodeWF(码坊)。
- 官网
https://codewf.com。 - 使用CodeWF.Tools.Core NuGet包的AssemblyExtensions获取程序版本、编译时间、许可证和运行时信息。
7. 文件与编码规格
7.1 支持文件类型
默认支持:
.md.markdown.txt
后续可扩展:
.mdown.mkd.mdx,需确认渲染策略后再支持。
7.2 文件打开
- 文件打开后必须更新当前文档快照、窗口标题、状态栏、最近文件、大纲、统计、预览。
- 启动参数传入存在的文件路径时,启动后自动打开该文件。
- 启动参数传入存在的文件夹路径时,自动加载文件列表并打开排序后的首个 Markdown 文件。
- 文件不存在、无权限、编码失败时必须给出状态提示和错误提示浮层。
7.3 编码
- 默认 UTF-8 无 BOM。
- 支持 UTF-8 BOM。
- 支持 GB18030。
- 支持 Big5。
- 保存时使用当前文档 Encoding。
- 重新选择编码打开时不得自动覆盖原文件。
7.4 保存状态
IsModified由当前 Markdown 与最近一次保存快照比较得出。- 未保存时窗口标题和当前文档标题前显示
*。 - 状态栏显示 Saved 或 Modified。
- 关闭文档、关闭窗口、打开新文件、删除文件前,如存在未保存改动,后续必须增加保存确认。
7.5 最近文件
- 最近文件保存到用户应用数据目录。
- 最多显示 10 个。
- 新打开的文件置顶。
- 重复打开同一路径不重复显示。
- 文件不存在时自动移除。
8. Markdown 能力规格
8.1 基础语法
必须正确编辑和预览:
- 标题。
- 段落。
- 加粗、斜体、删除线。
- 行内代码和代码块。
- 引用。
- 有序列表、无序列表、任务列表。
- 链接与图片。
- 表格。
- 水平分割线。
- HTML 片段。
8.2 扩展语法
优先支持:
- GFM 表格。
- 任务列表。
- 自动链接。
- 脚注。
- 数学公式块与行内公式。
- 目录锚点。
- 代码高亮。
扩展语法实现依赖 CodeWF.Markdown 或 Markdig 时,应确认渲染、导出和裁剪发布都正常。
8.3 大纲生成
- 根据 ATX 标题
#到######生成。 - 忽略代码块内的伪标题。
- 标题文本应去除 Markdown 标记。
- 点击大纲项跳转到编辑器对应行。
- 大纲为空时展示空状态。
8.4 统计
实时统计:
- Words。
- Characters。
- Lines。
后续可扩展:
- Reading time。
- Headings。
- Paragraphs。
- Selected words。
9. 查找与替换规格
9.1 查找栏
Ctrl+F打开查找栏。- 查找栏打开后应聚焦搜索输入框。
F3查找下一个。Esc关闭查找栏并回到编辑器。- 未输入搜索文本时状态栏提示。
9.2 替换
Ctrl+H打开替换模式。- 替换下一个只替换当前匹配。
- 全部替换应返回替换数量。
- 搜索不到时状态栏提示。
9.3 查找增强
- 区分大小写。
- 全词匹配。
- 正则匹配。
- 循环搜索提示。
- 搜索结果计数,例如
3/12。
10. 复制自媒体
10.1 复制到公众号
- 点击“复制到公众号”必须复制微信公众号文章编辑器可直接粘贴的富 HTML,不是 Markdown 源文,也不是只包含普通文本的 HTML 字符串。
- 剪贴板必须通过
CodeWF.Markdown的MarkdownHtmlClipboardExtensions.TrySetMarkdownHtmlAsync(markdown, themeName, targetName, typographySize)写入富 HTML 载荷:包括text/html、macOSpublic.html和 Windows 原生HTML Format。WindowsHTML Format必须是 UTF-8 CF_HTML 字节数据,片段偏移按字节计算;同时可提供 plain text 兜底,兜底内容应是完整 HTML 片段,不应回退为 Markdown。 - HTML 片段根节点使用
section#vex,包含多语言资源解析后的data-tool、data-website="https://codewf.com"和必要的 inline style。 - 公众号内容必须使用当前 Markdown、当前排版主题和紧凑布局配置生成;所有公众号需要的样式写入 inline style,不依赖外部 CSS、外部 class 或运行时脚本。
- 标题、段落、列表、引用、代码块、表格、链接和图片至少应在微信公众号编辑器中保持可读排版;本地图片按当前复制能力内联或转换为粘贴后可显示的资源。
- 主题色、标题边框、段落间距、代码块背景、表格边框等样式应与 Vex 预览和 CodeWF.Markdown 排版主题保持一致。
- 最小验收样例:
## 这是标题
这是内容剪贴板 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>- 验收时必须把剪贴板内容粘贴到微信公众号正文编辑器,确认不是显示原始 HTML 文本,而是按富文本结构正常渲染,并确认当前排版主题的标题色、正文色、链接色、边框色和代码块背景已生效。
10.2 复制到知乎
- 导出符合知乎编辑器粘贴要求的富 HTML 片段,使用同一套
MarkdownHtmlClipboardExtensions剪贴板写入能力。 - HTML 文档包含标题、编码声明、
vex-copy-target=zhihu元数据和section#vex片段。 - 内容应使用当前 Markdown、当前排版主题和紧凑布局;标题、段落、列表、引用、代码块、表格、链接和图片的关键样式必须 inline。
- 粘贴到知乎编辑器后不得显示原始 HTML 文本,且标题色、链接色、表格边框和代码块背景应跟随当前排版主题。
10.3 复制到稀土掘金
- 导出符合稀土掘金编辑器粘贴要求的富 HTML 片段,使用同一套
MarkdownHtmlClipboardExtensions剪贴板写入能力。 - HTML 文档包含标题、编码声明、
vex-copy-target=juejin元数据和section#vex片段。 - 内容应使用当前 Markdown、当前排版主题和紧凑布局;标题、段落、列表、引用、代码块、表格、链接和图片的关键样式必须 inline。
- 掘金后缀文案也必须跟随当前主题的正文色和链接色,不允许保留固定蓝色/灰色模板色。
- 粘贴到稀土掘金编辑器后不得显示原始 HTML 文本,且主题样式应与 Vex 预览和 HTML/打印导出保持一致。
11. 导出与打印规格
11.1 HTML 导出
- 导出完整 HTML 文档。
- 包含标题、基础 CSS、编码声明。
- 内容应使用当前 Markdown。
- 文件名默认跟随当前文档名。
- 导出完成后状态栏显示文件名或路径。
11.2 PDF 导出
当前已支持可选择文本的分页 PDF 导出;成熟版本继续完善:
- 使用的渲染组件许可证与源码情况。
- 跨平台可用性。
- AOT、裁剪、Win7 兼容性影响。
- 字体、分页、图片、代码块、表格处理。
PDF 导出必须保留正文文本的选择和复制能力;后续继续优化复杂块级元素、分页、页眉页脚和排版主题映射。
图片等资源需要嵌入 PDF 文件;本地相对图、data:image、HTTP(S)、SVG/GIF/WebP 等图片源应统一解析或栅格化,通过邮件、QQ、微信等接收后也能正常预览格式和图片。
11.3 Word 导出
当前已支持 .docx 导出;成熟版本继续完善:
- 使用的渲染组件许可证与源码情况。
- 跨平台可用性。
- AOT、裁剪、Win7 兼容性影响。
- 字体、分页、图片、代码块、表格处理。
当前实现使用 OpenXML 包结构写入 Word 文档,支持基础标题、段落、列表、任务列表、引用、代码、分割线、表格、链接文本和图片嵌入;图片加载复用 CodeWF.Markdown,支持本地相对图、data:image、HTTP(S) 图片,并将 SVG/GIF/WebP 等必要格式转换为 PNG 后写入 .docx。后续继续完善编号样式、复杂 HTML、分页控制和更细的标书格式要求。
图片等资源需要嵌入 Word 文件,通过邮件、QQ、微信等接收后也能正常预览格式和图片,Word 格式规范,正常标书要求格式。
11.4 PNG 导出
当前已支持将当前文档导出为长图 PNG;成熟版本继续完善:
- 渲染区域。
- 图片尺寸与缩放。
- 长文档分页或长图策略。
- 跨平台图形后端兼容性。
11.5 打印
当前阶段:
- 生成临时 HTML 打印预览。
- 使用系统默认浏览器打开。
成熟版本:
- 支持原生打印对话框或稳定的跨平台打印方案。
- 支持页面边距、纸张大小、页眉页脚。
- 打印效果接近预览和 HTML 导出。
12. 主题、排版与视觉规格
12.1 视觉风格
- 整体风格克制、清爽、偏生产力工具。
- 不做营销式首页,不做大 Hero。
- 默认界面优先保证文字编辑效率和信息密度。
- 面板圆角不超过 8px,除非控件库主题有一致规范。
- 不使用无意义装饰图形、渐变球、背景光斑。
12.2 最小尺寸
主窗口最小尺寸要求:
- 宽度不小于 980。
- 高度不小于 640。
- 在最小尺寸下标题栏菜单、窗口按钮、状态栏徽标不能挤压错位。
- 状态栏右侧徽标必要时应压缩或隐藏低优先级项,不允许覆盖左侧状态文本。
12.3 深色模式
深色模式成熟要求:
- 标题栏、菜单、侧边栏、编辑器、预览、状态栏统一深色。
- 文本对比度足够。
- 代码块、链接、引用、表格样式可读。
- 输入框、按钮、浮层边框清晰。
- 不同主题都需要适配
12.4 字体
- 默认字体优先 Inter、Microsoft YaHei UI、Segoe UI。
- 编辑器等宽字体优先 Cascadia Mono、Consolas。
- 不使用随窗口宽度缩放的字体大小。
- 标题、面板、状态徽标字体大小应与容器匹配。
12.5 Markdown 排版主题色
- Markdown 排版主题色由 CodeWF.Markdown 提供,Vex 只通过 NuGet 使用,不在 Vex 内硬编码一套平行样式。
- 排版主题名称必须与
D:\temp_styles中的 CSS 文件名一一对应,至少包含:简、橙心、墨黑、科技蓝、全栈蓝、兰青、姹紫、嫩青、山吹、极客黑、红绯、绿意、萌绿、蓝莹、蔷薇紫。 - 菜单显示名、配置保存值、CodeWF.Markdown 主题 ID 和实际样式不得错位、重名或缺项。
- 每个主题的主色、标题色、链接色、引用色、代码块背景、表格边框和根容器文字色应参考对应 CSS 文件前部样式实现。
- 主题切换后,Markdown 预览、HTML/打印导出、PNG/PDF 导出和“复制到公众号/知乎/稀土掘金”应使用同一套排版主题映射。
- 深色或高饱和主题要保证正文、代码块、链接、表格和引用在浅色/深色应用主题下都有足够对比度。
12.6 状态栏与界面细节
- 状态栏必须呈现专业桌面工具质感,避免临时标签、随机高饱和色块、过厚边框或与主题不一致的背景。
- 左侧状态文本应具备弹性宽度和省略策略,右侧保存状态、编码、缩放、行列、词数、字符数等徽标应对齐、等高、间距一致。
- 最小窗口宽度和长状态文本下,状态栏不得挤压主编辑区,不得让徽标覆盖文本;低优先级信息可以折叠或隐藏。
- 标题栏、侧边栏 Tab、文件列表、大纲、查找栏、浮层、菜单和状态栏需要一起做视觉检查,避免单个区域完成但整体观感割裂。
- 若后续确认存在关联 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 | 缩小 |
注意:
- 编辑器自身应优先处理文本编辑快捷键。
- 窗口级快捷键不得破坏输入法和正常文本输入。
- 带文件选择器的快捷键应先标记事件已处理,再执行 async 操作。
14. 发布规格
14.1 发布目标
必须支持以下 RuntimeIdentifier:
win-x64linux-x64linux-arm64osx-x64osx-arm64
14.2 发布 Profile
Vex 主工程必须包含 VS 可选择的 Folder Profile:
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 输出目录
发布产物统一输出到仓库根目录:
publish/<RuntimeIdentifier>/例如:
publish/win-x64/
publish/linux-x64/
publish/linux-arm64/
publish/osx-x64/
publish/osx-arm64/14.4 Windows 发布
- Windows 发布支持 Native AOT。
- Windows 运行目标支持 Win7。
- 必须使用 VC-LTL 与 YY-Thunks NuGet 包,避免 Win7 环境额外安装 VC 运行时。
- 发布后应在可用环境执行启动烟测。
14.5 Linux/macOS 发布
- 支持 self-contained single-file。
- 在 Windows 上发布非 Windows 平台时,非 AOT 也应启用 PublishTrimmed,以减少产品体积。
- 启用裁剪后必须维护免裁配置,避免目标平台运行异常。
macOS需生成.dmg.pkg.app等格式
14.6 裁剪免裁配置
Vex 必须维护:
src/Vex/Properties/Trimming/TrimmerRoots.xml免裁内容至少覆盖:
- Vex 主程序集。
- Avalonia 核心与 XAML 加载相关程序集。
- Prism 与 DryIoc。
- ReactiveUI。
- CodeWF.EventBus。
- CodeWF.Markdown.Themes。
- Semi.Avalonia。
- Ursa.Avalonia。
- SVG、图片、字体和反射加载相关组件。
14.7 一键发布脚本
根目录必须提供:
publish_vex_all.bat要求:
- 顺序发布所有 RID。
- 任一发布失败时返回非零退出码。
- 输出清晰,能看出当前发布 RID。
- 不删除用户未确认的文件。
15. 日志与文档规范
15.1 开发日志
文件:
要求:
- 完成一个小功能即记录。
- 同时记录中文和英文摘要。
- 记录关键验证动作,例如构建、截图、发布、漏洞扫描。
- 记录第三方许可证核查结论。
15.2 更新日志
文件:
UpdateLog.md要求:
- 面向用户,简洁清楚。
- 当前只维护中文文档。
- 区分新增、优化、修复、删除、测试验证。
- 不写冗长实现细节。
中文推荐格式:
- 😄[新增]-描述用户可感知的新能力。
- 🔨[优化]-描述体验或工程优化。
- 🐛[修复]-描述已修复的问题。
- 🧪[测试]-描述完成的验证。
- ❌[删除]-删除功能说明15.3 帮助文档
至少维护:
- 更新日志。
- 鸣谢。
- 后续增加用户手册、快捷键、导出说明。
16. 测试与验收
16.1 每次提交前必须执行
dotnet build Vex.slnx -v:minimalgit diff --check- 涉及依赖变化时执行
dotnet list Vex.slnx package --vulnerable --include-transitive - 涉及 UI 的改动必须启动桌面程序截图验证。
- 涉及发布配置的改动必须至少验证对应 publish profile 或一键发布脚本。
16.2 桌面截图验收
截图至少覆盖:
- 默认启动主窗口。
- 打开文件后的标题、编辑区、预览、状态栏。
- 打开文件夹后的文件列表和默认文档。
- 查找/替换栏。
- 字数统计面板。
- 属性面板。
- 关于面板。
- 删除确认面板。
- 源代码模式。
- 最小窗口尺寸。
- 不同主题、不同排版、不同语言排版。
- 文件列表右键菜单、重命名面板和外部文件变更自动刷新。
- 复杂 SVG 回归样例在浏览器与 Vex 预览中的对比。
- 新手引导在菜单项、TabItem、普通目标控件和状态栏上的箭头与高亮边框。
- 状态栏在最小宽度、长状态文本、浅色主题和深色主题下的显示。
- Markdown 排版主题色按
D:\temp_styles全量或分批截图抽查。
截图检查项:
- 主界面是否空白或卡死,界面色彩搭配。
- 文本是否溢出。
- 控件是否重叠。
- 状态栏是否拥挤。
- 浮层是否居中、宽度是否合适。
- 预览是否正常渲染。
- SVG 图形、公众号复制样式和新手引导箭头是否存在明显缺失。
- 排版主题色是否与参考 CSS 名称和主色一致。
16.3 功能验收清单
成熟版本至少满足:
- 新建、打开、保存、另存为、关闭正常。
- 打开文件夹、文件列表、最近文件正常。
- 文件列表右键菜单的打开、重命名、打开文件位置、删除正常。
- 打开的文件被外部修改后,当前编辑区、预览和文件列表摘要自动刷新;存在未保存编辑时不得覆盖。
- 启动参数打开文件和文件夹正常。
- UTF-8、UTF-8 BOM、GB18030、Big5 重开正常。
- 编辑器常用快捷键、菜单动作正常。
- Markdown 预览实时更新。
- 大纲生成与点击跳转正常。
- 查找替换正常。
- 清除格式正常。
- 字数统计准确。
- 属性、关于、删除确认等浮层正常。
- HTML 导出正常。
- 打印预览正常。
- 主题、排版、语言切换正常。
- Windows AOT 发布正常。
- Linux/macOS single-file trimmed 发布正常。
- NuGet 漏洞扫描无未处理高危问题。
- 复杂 SVG 样例在 Vex 预览中不缺文字、菜单、气泡、按钮等关键元素。
- “复制到公众号/知乎/稀土掘金”剪贴板内容能在对应网页编辑器中以富文本方式正常渲染,并应用当前排版主题。
- 新手引导箭头清晰指向目标,目标控件高亮边框明显且不遮挡内容。
- 排版主题色名称与
D:\temp_styles一一对应,预览、导出和复制路径一致。
17. 错误处理规格
必须处理并提示:
- 文件不存在。
- 文件无读取权限。
- 文件无写入权限。
- 编码读取失败。
- 保存失败。
- 删除失败。
- 重命名失败。
- 打开的文件被外部删除或暂时不可用。
- 导出失败。
- 打开官网或帮助文档失败。
- 最近文件失效。
- 发布或构建脚本失败。
提示策略:
- 轻量提示优先状态栏。
- 会影响数据安全的错误必须使用浮层或对话框。
- 错误信息要告诉用户发生了什么和下一步能做什么。
- 不向普通用户暴露完整异常堆栈;详细异常可进入日志。
18. 性能要求
18.1 启动
- 冷启动应尽量控制在桌面应用可接受范围。
- 初始化语言不应造成明显闪烁。
- 加载最近文件不应阻塞 UI。
18.2 编辑
- 10 万字符以内文档编辑应保持流畅。
- 预览、大纲、统计更新应节流或增量优化,避免每次按键造成明显卡顿。
- 查找替换大文档时应避免 UI 长时间无响应。
18.3 文件夹
- 文件夹扫描默认最多 300 个文档。
- 已支持后台扫描;后续增加加载进度。
- 超大目录应可取消或快速返回。
19. 可访问性与输入法
- 所有菜单项可键盘访问。
- 常用操作有快捷键。
- 输入法组合输入不得被窗口级快捷键破坏。
- 按钮和输入框应有清晰焦点样式。
- 深色模式下对比度足够。
- 状态信息不应只通过颜色表达。
20. 安全与数据保护
- 删除文件必须二次确认。
- 删除确认必须显示完整路径。
- 不自动覆盖用户文件。
- 未保存内容离开前必须提示保存。
- 临时导出文件应写入系统临时目录或用户选择路径。
- 不上传用户文档内容。
- 最近文件只保存本地路径,不保存文档内容。
21. AI 编程执行规范
AI 继续开发时必须遵守:
- 先读相关代码,再改文件。
- 每次只做一个清晰的小功能,功能完整后提交。
- 不在无关文件做格式化或大范围重排。
- 使用
apply_patch修改文本文件。 - 不还原用户已有改动。
- 不创建第三方审计文档。
- 新增 NuGet 包前先查许可证、源码仓库、间接依赖。
- UI 改动后启动程序截图验证。
- 发布配置改动后执行对应发布验证。
- 每次提交前更新根目录
UpdateLog.md。 - Commit message 使用英文,例如
feat: add startup folder support。 - 提交后推送远端。
22. 推荐迭代路线
22.1 第一阶段:基础可用
- 应用框架、模块、主题接入。
- 标题栏菜单、三栏布局、状态栏。
- 新建、打开、保存、另存为。
- Markdown 编辑和实时预览。
- 文件夹列表和大纲。
- 最近文件。
- 基础快捷键。
- HTML 导出和打印预览。
- 发布 Profile 和一键发布脚本。
22.2 第二阶段:成熟编辑体验
- 未保存关闭确认。
- 查找替换增强。
- 编辑器语法高亮。
- 编辑器与预览滚动同步。
- 表格编辑辅助。
- 链接、图片、表格插入浮层。
- 拖放打开文件和文件夹。
- 自动保存草稿和崩溃恢复。
- 用户设置持久化。
- CodeWF.Markdown 可编辑预览控件原型。
- Vex 可视化编辑模式:默认隐藏源码编辑器,预览区可直接编辑。
22.3 第三阶段:成熟发布体验
- 复制到公众号
- 复制到知乎
- 复制到稀土掘金
- PDF 导出。
- Word 导出。
- PNG 导出。
- 原生打印。
- 深色模式完善。
- 多语言完整覆盖。
- 安装包或压缩包发布。
- 自动更新策略。
- 性能优化和大文件体验。
23. 当前已实现能力快照
截至本文档更新时,仓库已具备以下能力,后续实现应避免重复造轮子:
.slnx解决方案。- Avalonia + Prism + DryIoc + ReactiveUI 基础框架。
- CodeWF.EventBus 默认单例和
[EventHandler]通信模式。 - Semi.Avalonia、Ursa、Avalonia.Themes.Fluent 主题接入。
- 标题栏菜单、三栏布局、状态栏。
- 新建、打开、打开文件夹、保存、另存为、删除确认。
- 最近文件、快速打开、关闭当前文档。
- 启动参数打开文件和文件夹。
- 编码重开。
- Markdown 编辑、预览、大纲、统计。
- 查找替换栏。
- 清除 Markdown 格式。
- HTML 导出和 HTML 打印预览。
- 字数统计、关于、属性等浮层。
- 常用桌面快捷键。
- Windows、Linux、macOS 发布 Profile 与一键发布脚本。
- 裁剪免裁配置。
- 中英文更新日志与开发日志。
- UrsaWindow 主窗口、标题栏菜单、状态栏、查找栏、文件页签和大纲页签已拆分为独立 View。
- 侧边栏 TabControl 已通过 Prism Region 注入文件和大纲页签。
- Shell 主要子模块通过 Prism IoC 和 CodeWF.EventBus 解耦通信。
- 初步 i18n/l10n 资源已接入,后续需继续迁移剩余硬编码文案。
- 未保存内容离开前保存确认。
- 查找栏自动聚焦和搜索结果计数。
- 编辑器语法高亮、当前行高亮、行号和 Tab 缩进。
- 拖放打开文件和文件夹。
- 用户设置通过 App.config 持久化窗口、布局、主题、语言和编辑器显示状态。
- 深色模式已覆盖标题栏、侧栏、编辑器、预览区、状态栏和状态徽标。
- 编辑器光标移动时,预览区按文档位置同步滚动。
- 表格、链接、图片支持上下文感知插入:URL、图片路径和 CSV/TSV/管道分隔文本可自动生成对应 Markdown。
- 预览区可基于 CodeWF.Markdown 源码行定位精确滚动,失败时回退比例滚动。
- 直接打开单个文件时,左侧文件列表会同步加载该文件所在目录的 Markdown/txt 文档。
- 自动保存草稿和崩溃恢复。
- Semi 主题色菜单支持跟随系统、浅色、深色、水生、沙漠、黄昏、夜空。
- Markdown 排版菜单已补齐 CodeWF.Markdown.Themes 内置排版主题。
- 文件夹打开已改为后台扫描,并跳过无权限目录或读取失败的文件摘要。
- 文件打开、文件夹加载、保存、删除、导出、打印、帮助和系统打开失败时显示错误提示浮层;属性、统计和删除确认已迁移为 UrsaWindow 对话框。
- 文件列表右键菜单支持打开、重命名、打开文件位置和删除,当前打开文件重命名后同步更新标题、文件列表和最近文件。
- 当前打开的 Markdown/txt 文件支持外部变更监听,磁盘内容变化后自动刷新编辑区、预览和文件列表摘要;有未保存编辑时只提示不覆盖。
- 查找/替换栏支持区分大小写、整词匹配、正则匹配、搜索结果计数和循环搜索提示。
- 导出菜单支持 HTML、PNG、Word 和 PDF;PDF 正文当前可选择复制,后续继续完善分页断点和复杂块级元素精细排版。
- 新手引导覆盖关键菜单、文档列表、大纲、编辑区、预览区和状态栏,且可从帮助菜单再次打开。
- 深色模式已进一步覆盖查找栏、统计/关于/属性/删除对话框、未保存确认和错误浮层。
- 帮助菜单的内置文档统一使用简体中文文件名,快速开始和鸣谢文档会随程序输出。
- Markdown 预览按当前文档路径解析相对图片,常规图片、基础 SVG 和 GIF 已有预览/导出支持;复杂 SVG 渲染缺失按 24.1 作为近期修复项。
- 新手引导 Guide 的边缘对齐位置已通过本地
CodeWF.AvaloniaControls修正,文件菜单等靠边步骤不再越界;箭头显著性和目标粗边框按 24.4 继续增强。 - 编辑器普通回车支持智能换行,可延续缩进、引用、无序列表、有序列表和任务列表,空列表项回车会结束列表。
- PDF 导出页眉会显示文档标题,页脚会显示当前文件名和页码,并为元数据区域预留页面空间;分页切片优先选择连续空白带作为断点。
- HTML 打印预览提供屏幕工具条,可在自动打印被拦截时手动重试打印或关闭预览,正式打印时工具条隐藏。
- 文件重命名失败详情已覆盖四套 i18n 文案,包括空文件名、非法字符、重名和不支持扩展名等边界提示。
- 帮助文档缺失错误详情已覆盖四套 i18n 文案。
- Folder Publish Profile 不会自动删除
publish/<RID>/中已有文件,避免清理用户未确认的发布产物。 - 正式压缩包发布产物已有
scripts/package_vex_artifacts.ps1,可生成 zip、SHA256 与 release manifest;publish_vex_all.bat --package可在全部 RID 发布成功后自动打包。 - PDF/PNG 导出渲染失败详情继续迁移到四套 i18n 文案,覆盖 PDF 创建、位图解码和 SVG 栅格化关键失败路径。
- 关于窗口链接和 Shell 浮层遮罩已改用主题资源,暗色主题下链接颜色与遮罩强度单独配置。
- 预览滚动比例改用编辑器维护的行数,减少大文件中光标移动触发的全量 Markdown 扫描。
- 当前文档无文件路径的重载失败详情已迁移到四套 i18n 文案。
- 更新日志帮助文档补齐繁体中文与日文摘要文件,并纳入构建/发布输出。
- 打印预览临时 HTML 文件名会清理非法字符并限制长度,避免特殊文档名导致预览文件创建失败。
- 发布打包脚本会在压缩前预检 manifest、发布目录和目标产物冲突,避免失败时留下部分压缩包。
- Markdown 统计正文词数/字符数改为单次字符扫描,减少大文件统计时的临时字符串与正则匹配分配。
- README 已记录构建、一键发布和压缩包打包命令,方便生成
artifacts/release/正式压缩包产物。 - 系统 Shell 未能启动打印预览浏览器时会显示本地化错误详情,不再误报预览已打开。
- 发布打包脚本支持逗号分隔 RID 参数,手动指定多个 RID 时会规范化为多个运行时目标。
- Markdown 大纲扫描改用手写 ATX 标题解析,减少长文档逐行正则匹配开销。
- 帮助文档统一回退到简体中文文档,避免继续维护多语言文档副本。
- Markdown 统计的行数、段落、标题和横线统计合并为单次字符扫描,减少大文件逐行正则匹配开销。
- HTML/打印、PNG 与 PDF 导出会读取当前 Markdown 排版主题和紧凑布局,并通过共享导出样式映射应用颜色与字号;PDF 正文输出为可选择、可复制文本。
- 打印预览工具条支持纸张、边距和页眉页脚开关,正式打印时可固定显示文档标题页眉和文件页脚,并通过动态
@page应用设置。 - 帮助文档在
zh-TW、zh-HK、zh-MO等传统中文区域优先回退繁体中文文档,再回退简体中文。 - Windows MSIX 打包脚本
scripts/package_vex_msix.ps1已具备:从publish/<RID>/生成 full-trust MSIX 布局、写入AppxManifest.xml、补齐 logo 资产、调用 Windows SDKmakeappx.exe打包,并可选用signtool.exe签名。 - 标题菜单已补充暗色主题下的动态前景、悬停和选中态颜色;主题色、排版主题和语言菜单会显示 Radio 勾选,紧凑布局会显示 CheckBox 勾选。
- 大文件连续输入时,未保存状态和草稿排队会立即更新,预览文档状态、统计和大纲构建合并到 220ms 防抖刷新,减少每字符触发的全量 Markdown 派生扫描。
- 查找栏全文匹配计数已改为 180ms 防抖,打开查找/替换面板时仍立即计数,关闭面板会取消挂起计数,减少长文档连续输入搜索词时的重复全文扫描。
- 查找 Count 路径会在单次扫描中直接计算总命中数和当前命中索引,不再为所有命中分配
SearchMatch列表;Find/Replace 路径仍保留完整命中信息。 - PDF 页面背景、页眉页脚元数据颜色和分页策略会读取当前
MarkdownExportStyle;暗色排版主题不再按白底假设处理页面样式。 - 替换下一个和全部替换会使用 AvaloniaEdit 文档级
Replace更新内容,避免单次替换也通过整篇字符串重设编辑器文本。 - 打开文件夹时会先取前 300 个支持的 Markdown/txt 文件,再对这批文件排序展示,避免大目录为了列表上限先排序全部匹配文件。
- HTML 打印预览的屏幕工具条、表单控件、页眉页脚、打印背景和链接色会读取当前
MarkdownExportStyle,并补充图片、列表项、表格行等打印断页保护,暗色排版主题下预览与打印视觉更一致。 - 左侧文件列表摘要生成改为有界流式扫描:最多读取前 8 行、4096 个字符,单行最多保留 512 个字符再生成 96 字符摘要,避免超长单行文件拖慢文件夹加载。
- 帮助菜单未知或空 topic 的状态栏排期提示和错误上下文已移除固定英文
Help兜底,空 topic 会复用当前语言的帮助菜单文案。 - MSIX
PrepareOnly准备布局不再被已存在的目标.msix包文件阻塞;包文件覆盖检查只在真实打包时执行,并已通过临时发布目录 smoke 验证。 - 普通
TextBlock默认前景色和右键ContextMenu背景、边框、菜单前景、悬停态已接入 Vex 动态主题资源,减少暗色模式下文本和弹出菜单边界的浅色默认回退。 - Markdown 大纲扫描改为
ReadOnlySpan<char>逐行解析,不再为每一行分配字符串;只有命中标题才创建标题文本,并会跳过反引号与波浪线代码围栏。 - PNG/PDF 导出会识别任务列表状态,将
- [ ]与- [x]渲染为[ ]/[x]marker,减少复杂块级元素映射缺口。 - HTML/打印/复制与 PNG/PDF/Word 导出解析本地图片时会同时尝试原始路径和 URL 解码路径,带空格等需编码的相对图片文件名不再容易导出缺图。
- 繁体中文与日文更新日志摘要已刷新到最近的导出、性能、暗色主题和 MSIX 打包改动,并继续随主项目复制到输出目录。
- 大纲、PDF 页眉和 HTML 打印预览标题共用
MarkdownHeadingScannerspan 扫描器,会跳过反引号/波浪线代码围栏内的示例标题,并支持 3 空格以内缩进的 ATX 标题。 - PNG/PDF 导出的表格单元格会渲染段落 inline,保留粗体、斜体、删除线、行内代码和链接样式,不再全部压平成纯文本。
- 无路径且无文件名的文档导出时,HTML 打印预览和 PDF 页眉页脚兜底标题会读取
DocumentDefaultFileName/DocumentDefaultHeading资源,不再在导出路径硬编码Untitled.md。 scripts/stress_vex_markdown_services.ps1已补充真实大文件压测入口,默认 120,000 行生成约 10.3M 字符 Markdown,并验证大纲扫描约 154ms、统计扫描约 498ms。- 属性、字数统计和删除确认已使用 UrsaWindow 对话框;长名称、长路径和错误详情等文本可选择复制。
- 查找和替换输入框限制为 200 字符并强制单行显示,避免粘贴超长内容破坏布局。
- 导出 HTML、PDF、PNG、Word 成功后会打开保存目录并定位文件;PDF/PNG/Word 导出已复用
CodeWF.Markdown图片加载和栅格化能力,支持本地相对图、data:image、HTTP(S)、SVG/GIF/WebP,并确保 PDF 正文可选择复制、PDF 与 Word 文件可离线查看嵌入图片。 - 复制到公众号、知乎、稀土掘金会通过
CodeWF.Markdown.MarkdownHtmlClipboardExtensions写入富 HTML 剪贴板内容,工具名、网站和尾注文案读取CodeWF.Markdown多语言资源,并把当前MarkdownExportStyle的主题色、字号、边框、代码块背景和掘金尾注样式内联到片段中。 - 从网页复制内容后粘贴到中间编辑器时,Vex 会优先读取
text/html、public.html或 WindowsHTML Format,调用CodeWF.Markdown.MarkdownHtmlClipboard.Html2Markdown(htmlContent)转为 Markdown;没有 HTML 或转换失败时回落到 AvaloniaEdit 原生粘贴。
24. 近期修复需求(来自 D:\r.md)
以下事项优先级高于常规迭代路线。参考 SVG、截图和 CSS 文件只用于分析与验收,不得直接改动;涉及 CodeWF 依赖库时,必须先在依赖库本地打包 NuGet,再由 Vex 引用验证,验证通过前不要提交 Vex 或依赖库仓库。
24.1 CodeWF.Markdown 复杂 SVG 渲染完整性
问题样例:
- SVG 文件:
D:\wwwroot\img1.dotnet9.com\2026\05\codewf-avalonia-guide-cover.svg。 - 浏览器正确效果:
D:\temp_imgs\1212.png。 - Vex 当前缺失效果:
D:\temp_imgs\2121.png,主要表现为只显示背景、遮罩或局部元素,标题、菜单、引导气泡、按钮等关键内容缺失。
实现要求:
- 优先在
D:\github\CodeWF.Markdown修复 MarkdownViewer 或其 SVG 图片渲染实现,不修改 SVG 样例文件本身。 - 支持常见复杂 SVG 能力,包括文本、嵌套分组、渐变、裁剪、遮罩、滤镜、透明度和 viewBox 缩放。
- 修复后 Vex 预览、HTML/打印、PNG/PDF 导出、Word 导出和复制路径中的 SVG 处理策略应保持一致;无法共享实现时必须记录差异。
- 回归验收必须同时截图浏览器参考与 Vex 预览,确认关键文本、菜单、气泡、按钮、底部标签和背景都完整可见。
24.2 CodeWF.Markdown 排版主题色修正
参考目录:D:\temp_styles。
必须一一对应的主题名:
- 简。
- 橙心。
- 墨黑。
- 科技蓝。
- 全栈蓝。
- 兰青。
- 姹紫。
- 嫩青。
- 山吹。
- 极客黑。
- 红绯。
- 绿意。
- 萌绿。
- 蓝莹。
- 蔷薇紫。
验收要求:
- CodeWF.Markdown 内置主题、Vex 菜单显示名、配置保存值和实际 CSS/样式映射完全一致。
- 每个主题至少校验根文字色、标题色、链接色、引用色、代码块背景、表格边框、强调色和背景色。
- Vex 切换排版主题后,预览、HTML/打印、PNG/PDF 导出和复制到公众号/知乎/稀土掘金使用同一主题结果。
- 如果某个参考 CSS 中存在 Vex 当前不支持的样式能力,应记录降级策略,不能静默换成其他主题。
24.3 复制到自媒体富 HTML
问题:当前“复制到公众号/知乎/稀土掘金”必须在对应网页编辑器中正常粘贴为富文本,不能只复制 Markdown 原文,也不能把 HTML 片段当普通文本显示。
实现要求:
- Vex 菜单动作负责把当前 Markdown、排版主题和目标平台交给
CodeWF.Markdown.MarkdownHtmlClipboardExtensions,由公共库生成目标平台可粘贴的 HTML 片段并写入剪贴板富 HTML 格式。 - HTML 生成应复用当前
MarkdownExportStyle,避免 Vex 另写一套不一致的样式;三平台都必须读取当前排版主题和紧凑布局。 - 根节点使用
section#vex,携带data-tool、data-website和 inline style;标题、段落、列表、表格、代码块、图片等节点也应内联关键样式。 - Windows
HTML Format必须使用 UTF-8 CF_HTML 字节载荷并正确计算片段偏移;text/html和 macOSpublic.html也应同时写入。 - 粘贴到微信公众号、知乎或稀土掘金正文编辑器后应直接显示富文本排版,而不是显示 Markdown 或原始 HTML 文本。
- 掘金尾注、知乎/掘金的二级标题结构和公众号基础结构可保留平台差异,但颜色、字号、边框、代码背景和链接样式必须跟随当前主题。
24.4 CodeWF.AvaloniaControls 新手引导箭头增强
问题:目标控件与引导气泡之间的三角指示不够明显,目标控件框选效果也需要更强。
实现要求:
- 在
D:\github\CodeWF.AvaloniaControls修复 Guide 控件实现。 - 三角箭头应根据气泡位置自动贴合目标方向,具有清晰填充色、边框或阴影,不被遮罩覆盖。
- 目标控件高亮边框应比当前更醒目,浅色、深色和高对比主题下都能识别。
- 对菜单项、Popup、TabItem、状态栏、编辑区、预览区等目标分别截图验收。
24.5 Vex 界面视觉质量专项
第 5 条原始记录写作“Vue 界面优化”;若目标确为关联 Vue 页面,需先补充仓库路径。当前 Vex 仓库先按桌面端主界面视觉质量专项处理。
要求:
- 优先检查状态栏,因为它当前最容易暴露“不专业”的视觉问题。
- 同步检查标题栏菜单、侧边栏、文件列表、大纲、查找栏、浮层、右键菜单和预览区边界。
- 重点修正间距、对齐、字号、颜色层级、边框、圆角、悬停态、选中态、禁用态和深色模式对比度。
- 验收以截图为准,至少覆盖默认窗口、最小窗口、浅色主题、深色主题、长状态文本和打开文件后的真实状态栏内容。
25. 未完成重点清单
优先补齐:
- CodeWF.Markdown 复杂 SVG 渲染完整性:按
D:\wwwroot\img1.dotnet9.com\2026\05\codewf-avalonia-guide-cover.svg回归样例修复 Vex 预览缺失。 - CodeWF.Markdown 排版主题色修正:与
D:\temp_styles的 15 个 CSS 主题名称和主色一一对应。 - 复制到自媒体富 HTML:剪贴板写入微信公众号、知乎、稀土掘金可正常渲染的 HTML 片段,而不是 Markdown 原文或原始 HTML 文本。
- CodeWF.AvaloniaControls Guide 箭头增强:三角指示明显,目标控件粗边框清晰,Vex 使用本地 NuGet 包验证。
- Vex 界面视觉质量专项:优先优化状态栏,并覆盖标题栏、侧边栏、查找栏、浮层和右键菜单。
- PDF 导出成熟化:正文文本已可选择复制,继续补齐更复杂块级元素的排版映射;任务列表状态、表格单元格 inline 样式和图片嵌入已纳入 PNG/PDF 导出,Word 图片嵌入也已共用
CodeWF.Markdown图片处理链路。 - 原生打印或继续完善系统打印流程;当前 HTML 打印预览已具备主题化工具条、纸张/边距/页眉页脚控制、更稳定的打印 CSS,以及与 PDF/大纲一致的标题解析。
- 深色模式细节完善:继续验证排版主题内容区域对比度;普通文本和右键菜单弹出边界已接入 Vex 动态主题资源。
- I18n 文案完整迁移:继续补齐剩余边界提示;繁体中文/日文更新日志摘要、帮助菜单空 topic 英文兜底、打印/PDF 默认文件名兜底已更新。
- 大文件性能优化:继续补充 UI 级真实超大文件压测;服务级压测脚本已覆盖 120,000 行 Markdown,大纲/PDF/打印标题扫描已有共享 span 逐行扫描,文件摘要边界已有有界流式扫描保护。
- 安装包成熟化:MSIX 真实签名/安装验证和 MSI 方案按需补齐;压缩包发布产物、MSIX 布局/打包脚本与 PrepareOnly 冲突边界 smoke 已具备。
- CodeWF.Markdown 可编辑预览控件与 Vex 可视化编辑模式。