字字课

这是怎么做的

一个纯静态站:页面在构建时生成好,运行时没有数据库、没有登录、没有 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)