物理错题本
> 版本记录
> - 1.2.0 多选题四端打通(录题器 / 工作台 / 学生端 / 解析脚本);
> 录题器校验提示从 alert() 弹窗改为页面内提示。
> - 1.1.0 新增错题本工作台 workbench.html(录入 + 管库 + 复习 + 复盘 + 导出提醒)。
> - 1.0.0 首版:解析器 + 录题器 + 学生端。
用途
帮家长或老师把孩子试卷上的错题,快速变成可在电脑录题 + 平板/手机做题的数字化题库。
核心能力是把一段从试卷复制下来的原始文本(题干 + 选项 + 答案 + 解析),解析成符合 bank.json schema 的结构化题目。解析规则经过多道高考真题实测,能正确处理物理题特有的陷阱。
何时使用
- 用户粘贴一道或一批物理题文本,要求录入错题本
- 用户说"把这道题整理成错题""录进题库""整理一下这次月考的错题"
- 需要生成或校验
bank.json文件 - 用户要为别人(同学家长等)搭建一套错题本工具
工作流
场景 A:录入一道题(最常见)
- 拿到用户给的题目文本。若用户给的是截图,先说明无法做 OCR 自动识别(本项目已明确放弃 OCR 路线),请用户提供电子版文本,或按场景 C 走图片存档路线。
- 运行解析脚本:
python scripts/parse_choice.py --text "<题目原文>" \
--analysis "<答案解析文本,可选>" \
--tags "变压器,交流电" --source "2024一模"
题目较长时先写入临时文件再用 --file。解析文本里的 4 B 前缀会自动剥离并勾选题答案。
-
必须人工核对脚本输出,重点看这三项(详见
references/pitfalls.md):
- 有没有丢根号:15√2变成152就是 PDF 复制丢的,需手动补
- 选项 C、D 是否在:物理单位30 A容易被误判成选项边界
- 题干末尾有没有残留( )答题空 -
输出确认无误后,按需落盘:
# 单题 JSON
python scripts/parse_choice.py --file q.txt --out question.json
# 追加进已有题库
python scripts/parse_choice.py --file q.txt --merge bank.json
场景 B:批量录入
逐题跑脚本并用 --merge 累积到同一个 bank.json。每跑完一题用 --selftest 之外的目检确认,别一次性灌几十题 —— 解析错误会批量扩散。
全部录完后提醒用户:题库体积控制在 5 MB 以内(图片是 base64 内嵌),超了网页端会存不下。
场景 C:搭建一套新工具
用户要给别人(同学家长等)搭一套时:
cp -r assets/pc-recorder/ <目标目录>/
index.html—— 电脑录题器,浏览器直接打开,零安装。支持题干图文混排、答案图独立存档、导出 bank.jsonstudent.html—— 网页做题端,导入 bank.json 即可做题。给孩子在电脑上试,或自己验证录题效果
两个文件都是单文件零依赖,双击就能用。
场景 D:校验已有题库
用 references/bank-schema.md 的「字段一致性约束」逐条核对,重点查两组派生关系是否一致:
stemText应等于stemBlocks的文字块拼接stemImages应等于stemBlocks的图片块 dataUrl 列表answerImages绝不能出现在题干侧(会提前剧透答案)
关键约束
- 全角/字体映射归一化必须最先做:PDF 复制出来的文本,数字字母经常是全角的(
4D),
\d和[A-D]全都匹配不到,导致所有后续规则静默失效——代码逻辑全对但一条都不触发。
任何新写的正则处理,都要先过一遍normalize_fullwidth()。
排查时把文本repr()出来看码点,肉眼分辨不出全角半角。详见pitfalls.md第 12 条。 - 答案图永不进题干:
answerImages与stemBlocks/stemImages严格隔离,这是防剧透的硬红线 - 多选题支持了,但有三个连环坑:
correctAnswer可以是"AD",前提是
① 切选项之前先剥离【答案】AD标记,否则会粘连到 D 选项
② 答案正则用([A-D]{1,4})而不是([A-D]),且【】必须可选
③isCorrect要写成answer.indexOf(k) >= 0——全等比较会让所有选项变成 false,
录入时看不出问题,孩子做多选题时才爆发,永远判错且不报错
三端(录题器/工作台/学生端)均已支持「勾选 + 提交,全对才算对」。详见pitfalls.md第 10 条 - 不做 OCR:截图只能原图存档,不能自动转成文本。需要文本就找电子版
- 嵌套分式还原不了:
v = 6a/(3/4 T) = 8a/T这种分式套分式,PDF 拆成单字符行后结构信息丢失,
不要再尝试算法还原,直接建议用户贴答案截图 - 网页端不要用
alert()/confirm()做提示:
alert()是模态的,会阻塞整个页面(自动化测试时会把浏览器进程卡死,后续命令全部超时)。
校验失败一律用页面内的feedback(msg, "err")(红底醒目色块,8 秒后自动消失)。
只有「是否替换」这类需要用户二选一的决策才保留confirm()。 - 改了任一端都要同步其余三端:
parse_choice.py/index.html/workbench.html/student.html
各自有一份解析或判分实现。多选支持就是四端各改一遍的——漏一端就会出现「录入正常、做题判错」的诡异现象。
资源
scripts/parse_choice.py—— 选择题解析器,零依赖。支持--text/--file/ 管道输入,--merge追加题库,--selftest跑真题回归测试。修改解析逻辑后必须跑--selftestreferences/bank-schema.md—— bank.json 完整字段说明、示例、派生关系约束、体积警告references/pitfalls.md—— 12 类实测踩坑:√ 符号丢失、答案图剧透、物理单位误判、网页复制丢空格、题号前缀取错分组、全角符号、PDF 换行污染、localStorage 超限、分式被拆成多行、全角字符与 PDF 字体映射错位(最隐蔽,会让所有正则静默失效)assets/pc-recorder/—— 三个单文件网页,零依赖,可直接分发workbench.html错题本工作台(录入 + 管库 + 复习 + 复盘,日常主力)index.html录题器(题干区/答案区分离,适合贴截图、分两次粘)student.html网页做题端(家长在电脑上验证用,孩子日常用安卓 App)README.md—— 面向家长用户的操作手册(给人看的,与本文档的 Agent 视角互补)
使用注意
解析器的规则都是从真实试卷踩坑总结出来的,改动前先读 references/pitfalls.md。遇到新格式解析失败时,优先加一条带递增约束的回退分支,而不是放宽现有正则 —— 放宽会让之前修好的题重新坏掉。
scripts/parse_choice.py 与 assets/pc-recorder/index.html 里的 parseChoiceQuestionWeb() 是同一套逻辑的两个实现,改了任一侧都要同步另一侧。