Ouchihao
|
d867037308
|
fix(server): explain duplicate quick phrase conflicts
|
2026-09-30 02:22:35 +08:00 |
|
fanlusky
|
30e10fc887
|
fix(server): 五笔纯汉字导入忽略用户自造单字码并放行扩展区汉字
- 取单字码时排除用户词库日志里 user_inserted=1 的单字行,出厂码优先;
自造码只给出厂码表里没有的字兜底
- 五笔路径不再沿用 cpp-pinyin 的 U+4E00–U+9FFF 限制,扩展 A、兼容表意字
及 2/3 平面扩展区都可导入
|
2026-09-29 18:56:14 +08:00 |
|
Jia Sui
|
81ca402936
|
test(server): 修复临时目录隔离与真实词库污染
三件事:
1. 临时目录加 PID 后缀并在析构时删除。原先 msime-empty-hans-import 是固定名
且从不清理;固定名在并行 ctest 或多个工作树同时跑时会互相删掉(同样的
理由见 test_caret_prefix_input_session.cpp:27)。
2. 修复上一提交的端到端用例污染用户真实词库。ScopedDataDir 原来只调
SetEnvironmentVariableW:server 的 get_ime_data_path() 走
GetEnvironmentVariableW 读 Win32 环境块,重定向确实生效;但引擎的
data_file_path()(default_user_db_path 用它)走 _wdupenv_s 读 CRT 自己
那份副本,看不到新值。于是 record_user_insert 仍然写进
%LOCALAPPDATA%\metasequoiaime\msime_user.db——实测写入了 3 条
环境/计算机/诸葛亮。改为两处环境变量都写。
验证:跑测试前后各取一次快照逐行比对,944 -> 944,0 增 0 删(文件字节有
变化,是 SQLite 页复用,不是数据写入);端到端用例断言 count==3 也只有在
读临时库时才成立——真实库有 4 条 wubi 行,多出来的那条是用户自己导入的。
3. 补 WubiPhraseCodeRejectsCharsWhoseCodeIsShorterThanTheRuleNeeds,锁住上一
次提交的短码防御;同时修正我先前写错的一条断言——4 字以上每位只取 1 位,
1 位码够用,守卫不该误伤长词。
|
2026-09-29 18:44:53 +08:00 |
|
Jia Sui
|
e3086f4985
|
test(server): 补五笔纯汉字导入的端到端用例
上一提交只验证了取码纯函数与 importHans 的分发路由,没有验证「导入真的能写
进去」。这轮补一个针对真实 TU 的端到端用例:在临时目录建一个只含 wubi86 表的
msime.db(种子单字码与取码用例一致),把 METASEQUOIA_IME_DATA_DIR 指过去,
再走 HandleRequest 完成一次真实导入。
覆盖此前未验证的验收项:
- 规则推出的码与权重 30 确实落库,而不是拼音的 10000
- record_user_insert 落到用户词库,「导出五笔用户词库」才收得回这些词条
- 非法行(非汉字、码表缺字)计为失败并带行号,且不中断整批
- 重复导入判为已存在,不产生重复行
写测试时踩到两个自己的错误假设,都由用例本身暴露:
- 「观」在出厂 wubi86 里其实有码(cmqn),不能用它演示缺码
- 重跑一批(含失败行)时 ok 为 false 是 SummarizeImport 的既有语义
inserted>0 || (failed==0 && skipped>0),与拼音路径一致,不是缺陷
全临时目录,不触碰任何真实词库。
|
2026-09-29 18:44:53 +08:00 |
|
Jia Sui
|
301944a2dd
|
feat(server,ui-html): 五笔词库支持纯汉字词组批量导入
设置页词库管理新增「批量导入纯汉字词组到五笔词库」,把一份纯汉字名单
(人名、地名)直接变成五笔可打出的词条。
取码按 86 词组取码规则从 wubi86 单字码组合:2 字取首/次各 2 位,3 字取首/次
各 1 位加末字 2 位,4 字以上取首/次/三/末各 1 位。规则不是猜的——拿出厂词库
反推拟合,62601/62636 = 99.94% 命中;未命中的 0.06% 是作者为避重码手工改过
的词,正是规则正确的证据。单字保持自然码长不补 z,否则「节」会同时存在 abj
与 abjz 两条重复词条。
wubi86 没有 value 首列索引,逐字查码是全表扫描(实测 3.38ms/字,2000 字名单
要 6.8 秒),因此一次性把单字行读进内存(约 25ms)后纯内存查。
缺省权重按词库区分。实测拼音 2 字词 p50=2805/max=9931703,五笔 p50=10/max=110:
同一个 10000 落在拼音 p50~p60 的合理区间,搬到五笔则是全库 max 的 91 倍,
导入的词会碾压原生词条。拆出 kDefaultPinyinImportWeight=10000 与
kDefaultWubiImportWeight=30,ImportWubi 同步改用后者——这是行为变更。
顺带把四份逐字重复的导入结果汇总块收口为 SummarizeImport。ImportQuickPhrase
刻意留在外面:它原本不调 NotifyImeServerClearDictCache(快捷短语不由活动输入
会话消费,缓存失效对它无意义),一并收口会凭空加上这次调用。
协议零改动:importHans 与 wubi 都已在契约枚举内,因此不触碰 engine/contracts/
与 ui-html/webview2/shared/ 的生成物链条。
测试新增 7 个用例,覆盖四种取码规则、单字码长、缺字失败、权重刻度,以及
importHans 的分发路由——路由链的是真实 TU,用空数据目录让三条分支都在写库
前返回,因此不碰任何真实词库。
|
2026-09-29 18:44:53 +08:00 |
|
Neptrue_Lin
|
3eb82c7878
|
Merge branch 'develop' into feat/issue-234-rime-dict-import
|
2026-09-11 20:06:16 +08:00 |
|
 linyanmandlinym
|
6e03f57747
|
fix(server): 全拼导入按汉字数选择切分并识别文件编码 (#270)
无分隔拼音按汉字数另选完整切分,避免西安/xian 误报音节数不一致。设置页按 BOM 识别 UTF-8/UTF-16,无效 UTF-8 再回退 GBK。带撇号的水杉导出三列 TSV 本身已合法,回归测试钉住该格式。
Co-authored-by: linym <lin.yanming@foxmail.com>
|
2026-09-08 22:52:45 +09:00 |
|
linym
|
2776e157b0
|
style(server): wrap dictionary import test to satisfy clang-format
|
2026-09-08 20:58:57 +08:00 |
|
linym
|
28a0c03500
|
feat(server): 批量导入兼容 Rime userdb.txt 与 dict.yaml
|
2026-09-08 20:45:14 +08:00 |
|
fanlusky
|
bf0712cffd
|
Further standardize the issue of batch importing dictionaries.
|
2026-08-25 11:58:33 +08:00 |
|
fanlusky
|
dd113048f8
|
Add validation for dictionary insertion.
|
2026-08-09 22:27:16 +08:00 |
|