学习 86 版五笔和第五代仓颉拆字的桌面程序,基于 GPUI Fast 和 GPUI Kit。
灵感来自 wongsingfo/86wubi:用自己的文本练习, 边打边看拆字。不同的是这里的拆分是结构化数据,不是图片:
- 练习:稿纸式文字格,用系统的五笔输入法直接打字,程序逐字比对;输入法正在组字的编码显示在当前字下面。 右侧拆字卡显示字根序列、每一码的来源(字根 / 识别码 / 首、次、末笔)、简码;底部键盘高亮编码顺序。 提示模式可选:始终提示 / 出错再提示(停顿 6 秒也会提示)/ 不提示(Tab 偷看)。 打错的字会标出来,点任意字可以查看它的拆分或从这里开始练。
- 文本库:新建、粘贴、编辑练习文本(空一行就是分页);一键用最近的薄弱字生成“错字重练”。
- 查字:输入任意文字逐字显示拆分;空白时显示 86 版字根键盘和取码规则速记。
- 统计:累计字数和用时、速度/一次打对率曲线、每次练习记录、薄弱字。
侧栏「输入方案」可在五笔 86 版和仓颉第五代之间切换:拆字卡、键盘、字根表跟着换, 逐字熟练度、练习记录、每篇文本的进度和当前在练的文本都按方案分开(文本本身两边共用)。仓颉拆字卡显示每一码的字根、 字首/字身部件,以及部件在字里的取码和它单独成字时不同的情况(如「我」的手取 HQ,单独打 Q)。
cargo run --release需要 Rust 1.98.1(rust-toolchain.toml 会自动选择,gpui-fast 用到了较新的标准库特性)。
平时在 macOS 上开发和测试。GPUI Fast 也支持 Windows 和 Linux,程序里没有平台专用代码, 但还没在这两个平台上实际跑过,尤其是系统输入法的组字和上屏。
所有数据都在 SQLite 里,放在系统的应用数据目录下:
| 平台 | 路径 |
|---|---|
| macOS | ~/Library/Application Support/zigen/zigen.db |
| Linux | $XDG_DATA_HOME/zigen/zigen.db(默认 ~/.local/share/zigen/zigen.db) |
| Windows | %APPDATA%\zigen\zigen.db |
(可用环境变量 ZIGEN_DB 指定;旧版 wubi-mentor/wubi.db 会在首次启动时自动搬过来)。
| 表 | 内容 |
|---|---|
chars |
86 版字典:全码、简码、类别、字根拆分、识别码(首次启动时从 data/wubi86.tsv 导入) |
texts |
练习文本 |
text_progress |
每个方案在每篇文本上的进度和最近练习时间 |
char_stats |
每个方案下每个字的练习次数、出错次数、用时、连对次数(据此判断掌握程度) |
sessions |
每次练习的方案、字数、有效用时、一次打对数 |
meta |
设置(各方案的当前文本、提示模式、输入方案)和字典版本 |
data/wubi86.tsv 由 scripts/build_dict.py 生成:
- 拆分来自 gmgi1234/wubi 的
wubi86.js,脚本把其中的部件递归展开到基本字根; - 编码用 iHTCboy/iWuBi 的 86 版码表交叉校验,并补上简码。
9500 多个字里约 99.3% 的拆分和编码能互相印证;对不上的字在拆字卡上会标注“仅供参考”。 常用字 3500 字全部收录。
字根用「黑体字根」字体显示(assets/fonts/wubi-roots.ttf),它把 86 版字根和各种变形部件放在
Unicode 私用区。字体和逐码字形数据(wb_spelling.dict.yaml)来自
myshiqiqi/rime-wubi;原字体没有有效的 PostScript 名、
也没有字母 m(GPUI 会因此跳过它),scripts/patch_root_font.py 修正了这两点。
参与编码的字根直接用逐码字形,中间不取码的字根按全库统计映射到最常对应的字形。
上述来源都没有声明许可证,自用没问题,公开发布前请留意。
仓颉数据 data/cangjie5.tsv 由 scripts/build_cangjie.py 生成,直接编进程序(不入库):
- 编码来自 rime/rime-cangjie 的
cangjie5.base.dict.yaml(GPL); - 字首/字身拆分用 amake/cjk-decomp 的字形结构推出来, 再用各部件单独成字的编码印证;2 万多字里约 94% 能拆出字首字身,整体字约 3%,其余只逐码讲解;
data/cangjie5_keys.tsv是从拆分里统计出的每个键上常见的辅助字形。
内置文本只有《大学》《中庸》《论语》(data/texts/),用朱熹《四书章句集注》本,朱注放在正文后的括号里。
由 scripts/build_classics.py 从维基文库的《四书章句集注》
抓取,去掉维基文库编者的校记,再用 OpenCC 转成简体,最后按章插空行分页(太长的章在朱注后断开)。旧版内置的示例文本没改过的会在升级时换掉。
重新生成数据:
python3 scripts/build_dict.py <下载目录> data/wubi86.tsv "$(cat scripts/traditional_roots.txt)"
python3 scripts/patch_root_font.py <黑体字根.ttf> assets/fonts/wubi-roots.ttf
python3 scripts/build_cangjie.py <下载目录> data/cangjie5.tsv
python3 scripts/build_classics.py data/texts # 需要 pip install opencccargo test
# 按脚本操作界面并把每一步渲染成 PNG(仅 macOS;不需要屏幕录制权限;还支持 move/click x y 模拟鼠标)
ZIGEN_DB=/tmp/snap.db ZIGEN_SNAPSHOT=/tmp/snap \
ZIGEN_SNAPSHOT_SCRIPT="open 大学; type 大学之道; mark rqyy; lookup 照键; scheme cangjie5; lookup 我们; page stats" \
cargo run --features snapshot