Files
Jia Suiandfanlusky d414268b5f [Feat] U 模式重构为部件拆字反查 (#973)
* feat(engine,server,windows,ui-html,installer): U 模式重构为部件拆字反查 (#971)

把 U 模式从 Unicode 十六进制码位输入改成部件拆字反查:Shift+U 后输入各
组成部分的拼音连写(晶 = ririri)即可出字,候选上反显注音。

- 引擎:新增 local_modes/radical_query(前缀匹配、字频降序),数据表
  engine/radical/decomposition.txt 与生成脚本;LocalInputMode::Unicode
  改为 Radical;删除 unicode_query。
- Server:g_radical_mode_triggered + IsRadicalCompositionActive + 候选分发,
  用 cpp-pinyin 反显注音;删除 Unicode 码位路径。
- 前端 TSF:删除 U 模式的十六进制/数字特例与影子预判,按普通组合处理。
- 配置:utility.unicode_mode 改为 utility.radical_mode。
- 部署:assets 登记 radical_decomposition,安装器与 CI 拷表。

数据来源 mirtlecn/rime-radical-pinyin (GPL-3.0),授权见 engine/radical/NOTICE.md。

* feat(server): U 模式反显拼音改为带调风格(jīng)

* fix(server,installer): 修复 U 模式 CI(拆字表打包夹具与 clang-format)

* fix(engine,server): 修正 U 模式按键错位、重复候选与配置迁移

- Server 在 U 模式不再吞掉撇号、分号、斜杠、大写字母等键:TSF 已把它们记进按键缓冲,
  吞掉又不重同步会让两侧串和光标错位。照常插入,含非 a-z 的码查不出候选
- 拆字查询全码命中排在仅前缀命中之前,同一个字的几种拆法只出一次
- 升级合并把旧键 utility.unicode_mode 的值带到 utility.radical_mode,读取时也兜底旧键
- 生成脚本只收汉字,重建拆字表去掉 abc 码下的 51 行数字、字母与符号
- 开着 U 模式时在后台预热拆字表与 cpp-pinyin 词典,避开首个按键的冷加载
- Server 按会话的 RuntimePaths 查拆字表,删掉走全局数据目录的便捷重载
- cpp-pinyin 初始化合并到 utils/hanzi_pinyin,设置页导入注音共用;U 模式与快捷短语的收键分支合并

---------

Co-authored-by: fanlusky <1730976608@qq.com>
2026-10-16 01:01:18 +08:00
..

Runtime assets contract

assets.json is the shared inventory for the desktop runtime bundle. Each entry declares its stable ID, installation path, role, source and profiles. user entries name writable user files and are deliberately excluded from shipping profiles. Dictionary database format/schema compatibility remains owned by contracts/dictionary/.

  • generate.py produces assets.h for C++ resource lookup and helpcode scheme selection. This is the live part: roughly twenty engine translation units include that header.
  • product.py reads the inventory for packaging and verifies the exact ZIP member set, individual sizes/digests, contract version, dictionary product and source-commit agreement.

The builder that produced the engine-assets-desktop.zip bundle described below is not in this repository; it left with the dictionary pipeline (see UPSTREAM.md). The inventory and its verifier are kept because the header is generated from them and because the bundle format is still what the release side is checked against.

Run python3 contracts/assets/generate.py --check after editing the inventory. CI checks the generated header.

A consumer of the bundle uses the shared verifier before extraction:

from pathlib import Path
from contracts.assets.product import verify

manifest = verify(Path("engine-assets-desktop.zip"), expected_sha256=product_lock_digest)

The expected ZIP digest comes from the platform product lock, not the downloaded manifest. Verification is read-only and does not extract into application directories. The returned manifest records the producer commit and Google Pinyin source commit. The bundle carries source/permission notices without changing the underlying data permissions.

Contract version 2 adds sc.lm, the kenlm trigram that scores word-lattice sentences, and its notice. Because verify() compares the manifest's assets_contract_version against this inventory, a bundle built against version 1 no longer verifies: the release side has to produce one that carries sc.lm before a host can accept it. The model itself is not committed — the language-model/ source path names the directory where scripts/build-language-model.ps1 converts it from the ARPA corpus pinned in language-model/lock.json, which is how the Windows installer obtains it. A bundle producer can use the same script, or its own equivalent, as long as the bytes match that lock.

mutable-copy files are immutable release inputs but writable runtime dictionaries after installation. resource files remain in the resource directory; user files remain under the user's durable data directory. engine-assets-manifest.json is versioned separately from the dictionary database format. Older standalone dict-* assets remain supported.