Files
msime-windows/ui-html
Jia Sui e1a664a194 fix(server): 万象下载器改用格式锁,撤下无依据的评测宣称
锁定值与上游实际资产不符(字节数 409719852 vs 409412652,摘要 ae43724a… vs 873cbbb3…),下载在字节锁处失败。上游 LTS 会被原地重传且无不可变资产 URL,摘要硬锁意味着每次重训都要改代码发签名安装包,否则全用户下载失败,这个成本消不掉。

改为锁格式:删字节数常量,总长取响应 Content-Length 并在收完后比对一次(截断检测);新增 ValidateFormat 让引擎读取端自己开一次(魔数 + 双数组边界,不按文件自带长度做堆分配)。摘要不再参与放行,只判断 reviewed 并写入旁挂 .sha256(状态查询要频繁调用,不能每次重算 400MB 哈希)。真实上游字节按 open() 判据复核精确贴边通过:array_size=102353152,收尾正好在 409412652。

kReviewedSha256 保留旧值,摘要不符即 reviewed=false,设置页明示「上游已更新,未经评测」,NOTICE 记录实际摘要与字节数并附差异说明。契约无需重生成:sentence_collocation_model_status 是两个宿主各自拼的 ad-hoc JSON,不在 schema.json 内。

撤下无法验证的宣称:设置页删掉「评测 top1 +6 个百分点」(仓里没有评测工具、没有 docs/research,该数字无法复现),改为描述机制;清掉两处对从未进仓的文档与工具的引用(docs/research、tests/src/gram_reader、eval_lm_compare);修正 octagram_gram.h 里被本次改动失效的「摘要校验在下载侧做」。配置只改注释、未增删键,五件套映射不适用。
2026-10-02 20:15:39 +08:00
..
2025-12-08 13:29:47 +08:00
2025-11-10 21:13:13 +08:00

Metasequoia IME UI HTML

水杉输入法 Windows 端的界面资源。Server 加载这里的页面来渲染候选窗、悬浮工具栏、托盘菜单和设置窗口。

webview2/shared/ 是引擎 web 契约的副本,由 scripts/sync-contracts.py 从 ../engine/contracts/webview/ 生成,CI 用 --check 验证两者一致。要改契约请改那边,再在同一个提交里重新生成,不要直接改这个目录。

同仓的相关组件:../windows/(TSF 前端)、../server/(后端与窗口宿主)、../engine/(输入引擎与契约)。

目录

路径 内容
webview2/candwnd/ 候选窗,含 skins/ 下的皮肤
webview2/ftb/ 悬浮工具栏
webview2/menu/ 托盘菜单
webview2/settings/ime-settings/ 设置页,唯一需要构建的部分,Vite + TypeScript
webview2/default-themes/、webview2/other-themes/ 主题

除设置页外都是直接分发的静态资源,改完即生效。

构建设置页

设置页是发布安装包的必要输入之一,pnpm build 的产物 dist/ 会被打包脚本收集。

cd webview2/settings/ime-settings
corepack enable
pnpm install --frozen-lockfile
pnpm build

pnpm 版本由 package.json 的 packageManager 字段固定,corepack enable 之后不用自己装。开发时用 pnpm dev 起本地服务。

本地调试

把本仓链接到 Server 的数据目录,改页面就不用重新打包:

$target = Join-Path $env:LOCALAPPDATA 'metasequoiaime\html'
if (Test-Path -LiteralPath $target) {
    Remove-Item -LiteralPath $target -Recurse -Force
}
New-Item -ItemType SymbolicLink -Path $target -Target (Resolve-Path .).Path

必须用绝对路径,Resolve-Path 就是用来把当前目录转成绝对路径的。设置页走这条路时链接的仍是仓库目录,页面读的是 webview2/settings/ime-settings/dist/,所以改完设置页要重新 pnpm build。

与 C++ 侧的边界

窗口归 Server,页面归本目录。HWND、尺寸、位置、DPI、Z-order 和 WebView2 controller 的生命周期都在 ../server/src/window/ 与 ../server/src/webview2/;页面结构、样式和浏览器端交互在这里。

C++ → 页面主要经 WebView2 导航和脚本执行,页面 → C++ 经 window.chrome.webview.postMessage(...)。改消息 type、JSON 字段、页面导出的 JS 函数或 DOM 标识时,必须同步检查 Server 的消息解析与拼接代码,两边没有编译期约束。

候选内容和输入状态的权威在 Server 和引擎,页面只负责展示与发出用户动作;不要在页面侧复制候选选择、翻页、输入模式或配置持久化的状态机。

完整的组件边界约定见仓库根 AGENTS.md。