这是怎么做的
一个纯静态站:页面在构建时生成好,运行时没有数据库、没有登录、没有 Cookie。
流程
data/books.json 14 册 → 单元 → 课 → 生字 / 会写 / 词语
data/dict.txt 词表(jieba,MIT):生成"只用学过的字"的组词
data/makemeahanzi.txt 字形拆分:算形近字、部首
↓ python tools/build.py
dist/ 14 册 384 课 · 3479 个字 · 26100 个词
↓
任意静态托管
每个功能的做法
| 田字格 | CSS 边框 + 两条虚线,字用楷体;打印时同一套 DOM 换成黑白色。 |
| 笔顺 | Hanzi Writer(MIT)+ 笔画数据(Make Me a Hanzi,Arphic 授权)。本地有 JSON 就用本地,没有回落到 jsDelivr。 |
| 朗读 | 浏览器自带 speechSynthesis,不下载任何音频。 |
| 组词只用学过的字 | 每个字记"第几课第一次出现",每个词算"最晚那个字学完的课序",按当前课过滤。 |
| 同音字 / 形近字 | 同音按教材读音分组;形近按部件拆分分组,单笔画和成员太多的部件丢掉。 |
| 听写单 / 描红 | 同一份数据换个排法:空田字格 + 拼音;答案用 page-break 另起一页。 |
| 复习卡 | 几十行 JS:队列、翻面、会了/再来("再来"的卡过三张再出现)、成绩统计。 |
| 学习进度 | 网址带 ?lesson=G2A10,页面藏掉这课以后才学的字和词。状态全在 URL 里。 |
数据
14 册 384 课,3479 个不同的字,词表里筛出 26100 个可用的词。 生字表整理自公开资料,正式使用前请对照纸质课本校对——教材版本不同,字的顺序和多少会有出入。
已知的粗糙之处:组词是词表自动筛的,偶尔会有生僻词;易混字(日/目、已/己)需要人工规则,现在只有少量; 多音字的读音表也是人工整理的。
授权
笔画数据 Make Me a Hanzi(Arphic 公共授权)· 笔顺动画 Hanzi Writer(MIT)· 词表 jieba(MIT)