flyingmouse-format

0.7.0 转换质量修复与验收边界

作者:牢蜂(LaoFeng)。记录日期:2026-09-10。仅供个人免费使用,禁止商业售卖、转卖、套壳。

本记录对照 0.6.10 / aa286330ebc22975dfd49d5cbc40d06dec20c20e 的全面审查,以及用户附带的保存、引擎缓存、设置和版本同步复核材料。附件中的代码片段和建议按待核实材料处理;本轮修改依据用户随后明确授权的修复、同步、Git 提交及 APPX 打包任务。

源码修复、定向测试、最终包检查、商店安装与商店公开发布是不同状态。本记录说明源码修复与已经取得的证据;Git 提交、最终 APPX 文件、哈希和安装验收应以本次发布交付记录为准,不能由本记录推断已经完成。

核心转换

Markdown → Word、HTML、PDF

text-docx.js 的 Markdown → DOCX 入口已接入独立实现的 markdown-document.js,使用随包提供的 Pandoc 3.11 解析文档树,再生成 DOCX。正文不再按行用正则删除 Markdown 符号。标题、表格、嵌套列表、引文、代码、超链接和数学在各自节点内处理;代码块中的 **literal**、==literal==、$ X $ 和 <u>literal</u> 保持字面值。

真实输出检查确认 Heading1 样式、Word 表格、嵌套编号、超链接关系、下划线、黄色高亮和三个可编辑 OMML 公式;分式与根号生成对应的数学结构。Markdown → PDF 使用同一个 DOCX 中间产物,再由 LibreOffice 渲染。本轮已实际转换并查看 PDF 页面,确认中文、表格、代码、行内公式、分式、根号、下划线和高亮可见。

Markdown → HTML 使用独立的 Marked 数学扩展和 KaTeX 0.18.7,输出离线 MathML;不需要运行文档脚本或访问 CDN。代码节点不经过公式规范化。未知公式宏会返回 MARKDOWN_MATH_UNSUPPORTED,不会把未渲染公式当成成功转换。

图片必须随源文档提供并位于其资源目录内,或使用支持的内嵌图片。DOCX 转换会复制允许的本地图片到本次独立临时目录;缺图、越界路径和远程图片保留说明文字,并通过 API 返回 MARKDOWN_IMAGE_UNAVAILABLE。不会偷偷读取任意本地文件或联网补图。浏览器上传单个 MD 通常不包含其旁边的图片目录,因此外链图片仍需用户一并提供或内嵌,这属于输入资源边界。

getTools() 实际运行 Pandoc --version,将能力和诊断传给前端。没有可运行 Pandoc 时,MD/markdown 不提供 DOCX、PDF 目标;界面明确提示修复安装。TXT/HTML 的既有简易 DOCX 路线以及 MD → HTML 不依赖 Pandoc。所有 MARKDOWN_* 内容转换错误以 HTTP 422 和稳定错误码返回。

仍不承诺支持全部 LaTeX 宏包、Mermaid、任意原始 HTML、网页 CSS 或网络资源。Pandoc 对不支持内容的诊断会成为结果 warning;原始 HTML/TeX 中不能可靠转换的部分按原文保留并提示,不执行文档提供的模板、脚本或外部资源。DOCX 结构和 LibreOffice 渲染已验收;Microsoft Word/WPS 原生打开和每一种字体环境仍需分别检查。

PDF → Word 和混合 PDF

本批修复涉及 pdf-table.js 的坐标、文字行重建,以及 pdf.js 的正文顺序、内容校验和逐页 OCR。实际反例复测结果:

这些判断来自真实输出的文字、结构和页面检查。六个 DOCX 经真实 LibreOffice 转 PDF,共九页全部查看:旋转样本呈现完整一行,普通原生路线保留标题字号/文字间距,3×3 表格对照保留可编辑表格、标题、结尾和图片且不降级。混合样本输出四页,前两页为可编辑重建、后两页为原件对照,未看到截断或乱码。不能只检查 DOCX 是 ZIP 或 HTTP 返回 200。

PDF 源文档通常不包含可直接复用的 Word 段落和表格语义。即使文字覆盖检查通过,也不等于复杂分栏、竖排、合并表格、数学、扫描图片和原稿版面百分之百还原;本次修复不能升级成这种产品承诺。结构引擎较慢的样本需要等待,仍可能出现 OCR 字符或标点差异。

数据与电子书

问题 0.7.0 行为与证据
JSON → CSV 大整数和小数被改写 数字词法内容在进入浮点数之前保留;9007199254740993、长小数及数组内的 1e400 不再被舍入或改成 Infinity。CSV 列仍是文本,不替用户决定 Excel 导入时的数值类型
JSON 空对象、标量数组丢失 空对象保留为 {};嵌套 null 保留为 null;标量或数组行使用 value 列;字段路径冲突继续明确拒绝。真实输出回归覆盖这些条件
EPUB 流式 ZIP 失败 使用 yauzl 读取中央目录并逐项读完再继续,支持 data descriptor;测试确认流式 ZIP、单引号 XML、百分号编码路径及 spine 阅读顺序
EPUB 缺章和图片静默删除 缺失章节/图片明确失败;HTML/MD 保留包内栅格图片,使用 data URI 避免另存断链;HTML/PDF/DOCX 若简化 CSS,会返回 EPUB_STYLES_SIMPLIFIED
EPUB 能力表与实现不一致 EPUB 提供 TXT/MD/HTML,LibreOffice 可用时提供 PDF/DOCX;MOBI 保持其已实现的文本类目标
MOBI 乱试 zlib 后输出乱码 按 PDB 真实记录边界读取;支持未压缩及 PalmDOC 压缩,处理 UTF-8/Windows-1252;明确拒绝 HUFF/CDIC、KF8、未实现的附加记录、加密、无效编码和残缺正文

EPUB 的复杂 SVG 排版和加密/混淆资源目前明确拒绝;未声明完整固定版面支持。MOBI 验证包含按格式构造的真实二进制记录、PalmDOC 回溯与编码错误样本;两个可选 Gutenberg 文件在本机缺失,测试已改为明确 skip,不再以空跑冒充通过。以上不代表广泛真实电子书语料已全部验收。

用户附件的逐项关闭条件

附件反馈 本批状态与边界
404 等保存失败误删已有文件 原触发路径在 0.6.10 已修好,保留回归;本批不重新把它记为新修复或仍未解决
下载断流后句柄未关闭 已修复请求、响应、输出流的异常收尾;等待关闭后再清理临时文件。真实 HTTP 断流回归确认旧文件保留、流关闭
239 字符合法名称无法保存 使用短随机临时名,不再把完整目标名加随机长后缀;Windows 长文件名回归通过
Markdown 改名后资源断链 桌面和 CLI 共用 save-converted-result.js,使用本次独立资源目录并改写引用,全部附件成功后再发布主文件
附件失败仍显示成功 附件失败、清单缺项和文件名前缀误匹配都拒绝发布;保留已有主文件和旧资源。已保存的历史断链文档不会被自动修改
缓存缺失/损坏/空清单被直接接受 这些条件不能跳过验证;兼容旧缓存时执行真实转换检查。正式构建还需自动生成清单,并在最终包内验证其存在和内容
ICU 识别和清单输出漏项 生成器同时修正 ICU 文件名识别与收录;删除受保护文件后必须验证失败。不能把受保护清单误称为整套 LibreOffice 每一个组件的完整性证明
四字节 %PDF 冒烟通过 独立验收器真实解析 PDF,要求至少一页且包含预期 flyingmouse/42;四字节假文件及空白 PDF 被拒绝,真实 LibreOffice CSV → PDF 通过
设置单次失败后又被完整响应覆盖 字段合并保留本地编辑,未成功写盘的修改随下次保存重试;缺失字段不再构造空 targetBySource 清空旧偏好。真实设置文件、失败后重试、重启、晚到响应回归与浏览器检查通过;设置专项 15/15
设置队列不清理 0.6.10 的原修复继续有效;成功、失败、并发后续操作保留回归
版本同步缺少预校验 0.6.10 的原修复继续有效;本批保持先验证全部文件
某文件写入 12 字节后失败未回滚 当前可能已受损文件也进入回滚集合;注入 ENOSPC 的部分写入回归确认恢复。进程被强制终止或掉电的恢复能力不能由受控异常回滚推断

新保存操作保留独立旧资源目录,避免破坏用户旧文档;这可能留下用户已经不再需要的旧资源目录。清理时应以用户实际文档引用为依据,不能递归删除旁边所有 .assets 或资源目录。

其他已处理项与保留项

PasteMD 的借鉴范围

上一轮对照的 PasteMD 提交 5dce748a… 使用 Pandoc、参考模板和后处理完成 Word 结构转换,这比逐行删符号更适合 Markdown。Pandoc 官方数学说明明确了 DOCX 数学采用 OMML 的路线。

本项目独立集成 Pandoc 文档树,未复制 PasteMD 的 AGPL 实现。上一轮调用 PasteMD 实际默认 LaTeX 预处理函数,发现代码块中的 $ X $ 会被改写;本批通过按节点转换避免同类问题。没有运行 PasteMD 全部 Word/WPS 粘贴、模板和平台自动化,因此不宣称完整 PasteMD 已验收。其 AGPL-3.0 许可证以及 Pandoc 自身许可都应按各自范围处理,不能把第三方引擎套用本项目的非商业声明。

格式补充优先级

第一优先仍是 PDF、Markdown、附件保存和明确失败反馈。本批 JFIF/JPE 别名已实现;以下是后续建议,不是 0.7.0 已交付格式清单:

优先级 建议 需要独立验收的内容
第一批 SRT ↔ VTT,随后 ASS/SSA 时间轴、编码、重叠字幕、样式丢失提示;对应公开请求
第一批 PDF → Markdown、HTML/MHTML 图文包 逐页正文结构、附件保存;不能只换扩展名
第二批 RST、AsciiDoc、有限 TeX、IPYNB → Office/HTML/PDF 各解析器的真实样本、TeX 宏包和 Notebook 富输出边界
第二批 Lottie JSON → GIF/视频 识别动画结构并实际渲染,不能走普通 JSON 文本转换;对应公开请求
暂缓 CAJ、CAD/DWG、更多电子书容器 合法可分发引擎、真实语料、完整失败提示

ICO、OFD → PDF、ODT/ODS、AI/PSD、RAW 和 EPUB/MOBI 已有入口,不应再次统计为新增格式。PDF 长图是输出模式,硬件编码是执行能力,不能计入新格式数量。

UI、插件与角色图

浅色、深色、随系统使用页面级主题选择,并持久保存;显式选择不被系统变化覆盖,跟随系统时响应运行中的配色变化。文档、PDF 和图片本身保持原颜色,主题改变应用界面。真实 Chromium 页面 18/18 检查通过,包括持久化、失败重试、晚到响应、转换预览、390/780 像素宽度,以及 Pandoc 缺失时中英文提示;12/12 核心文字背景颜色对达到 4.5:1。系统配色变化通过浏览器媒体模拟检查,未冒充真实 Store 安装后原生系统切换验收。

本机最新已核验的 Fantasy Mouse UI 包是 0.2.0+codex.20260910074027。插件不是应用运行时组件,更新插件不会自动改写本项目源码或 PNG。当前最需要修订的是参考选择规则:带已知手部冲突的完整工坊场景不应继续作为默认正向参考。

用户指出的拉杆场景确实违反角色规则:胸前 V/U 代表合拢的双手;角色进入操作姿态时,应删除胸前 V/U,并且只保留一对实际操作手。它不是乳头、肚脐或固定身体装饰。本项目后续 UI 工作应以这一语义、实际接触关系和最终尺寸检查动作素材,不能以资源哈希校验替代造型验收,也不能把固定工坊图反复当作不同产品首页。

本批主题沿用现有鼠鼠品牌状态图;应用已有角色是合手静态图,与用户否定的错误拉杆场景不同,没有为解决参考问题而误删正确合手素材。没有声称已重新绘制角色或完成全局插件更新。错误操作场景不应作为新增素材引入。全新动作素材、全局插件参考清单修正和用户对角色的视觉确认仍需作为独立结果记录。

测试账本

以下组之间有重叠,不能相加成独立通过数量;测试通过也不能替代真实安装包检查。

检查 当前证据
首次完整主线检查 npm run test:ci:前置 95/95;主套 575 项、566 通过、9 跳过、0 失败。后续设置/UI 修正后需要再次运行相关检查
Markdown、JSON、电子书及 HTTP 50 项,47 通过、3 跳过、0 失败;包含真实 Pandoc DOCX、真实 LibreOffice PDF、二进制 EPUB/MOBI、HTTP warning/422。跳过项为 2 个缺失 Gutenberg 样本及旧 CSV PDF 测试硬编码安装路径
健康 UI/i18n/文本 HTTP 42 项,41 通过、1 跳过、0 失败;真实浏览器动态主题结果另记
PDF、结构、资源及安全 258 项,257 通过、1 个既有样本缺失跳过;后续安全保护追加复测 43 项、42 通过、1 跳过,与前组重叠
主题及设置 Chromium 18/18,核心颜色对比 12/12,设置专项 15/15;不等于插件完整 Strict 或原生 Store 视觉验收
保存、引擎、版本异常专项 34/34,0 跳过;后续文件名资源前缀修复与 CLI/设置联测 29/29,与前组重叠
进程及能力检查 19/19;涵盖大 stderr、输出上限、纯 JS DOCX 能力及 JPEG 别名
依赖审计 本次 npm audit --omit=dev:0 项告警
APPX 验收器 Python 定向测试 10/10;校验器通过不等于实际 APPX 已构建或安装

本次还需以最终同一份源码/包补齐:包内模块与 Pandoc/LibreOffice 清单、EXE/Identity/Publisher/版本/架构/图标、哈希,以及实际 Windows 安装运行状态。未现场检查的 Partner Center 审核和公开发布状态不得宣称完成。