RF · 成语知识卡片
是什么 / 什么时候用
输入一个成语 → 产出一张 16:9 知识卡片信息图,同时输出 HTML / PPT / PNG 三格式,内容与排版完全一致。
- 用:成语科普、安全文化传播、培训素材、公众号/群里分享的单图。
- 别用:批量成语文档(那是排版任务)、需要照片级插画的场景(走图片生成)、整场 PPT 课件(走 PPT 技能)。
核心约束(不可妥协)
- 单一内容源:成语内容只写在
scripts/card_data.py的CARDS里。HTML、PPTX、PNG 三份渲染脚本都从它读,禁止在渲染脚本里另写文字。 - 单一视觉源:颜色/字号/坐标只在
scripts/spec.py定义。三份渲染脚本 import 它;改版式只改这里,三份同步。 - 三格式关系:HTML 是母版 → PNG 由 Playwright 截 HTML 得到(与 HTML 100% 同貌)→ PPTX 用 python-pptx 按同一 spec 坐标原生渲染(文字全部可编辑,几何与 HTML 1:1:px→英寸 = px/96,字号 px→pt = px×0.75)。
- 字数断言先行:
build.py的validate()按版式容量卡各字段字数上限,超限直接报错。上限与规范见references/idiom-knowledge-guidelines.md,改 spec 后两处必须同步重算。
环境依赖(Windows,本机现成,零安装)
| 用途 | 工具 |
|---|---|
| 截图 PNG(优先) | Playwright(venv:C:\Users\tanhe\.workbuddy\binaries\python\envs\default\Scripts\python.exe) |
| 截图 PNG(回退) | Edge 无头 --screenshot(render_png.py 已内置回退) |
| PPTX | python-pptx(venv 已有) |
| PPTX 回渲验收 | LibreOffice soffice.exe --headless --convert-to pdf + pymupdf 渲图看 |
一律用 venv 解释器跑脚本(系统 python 缺 playwright/pptx)。
步骤
1. 内容生成(先读规范再动笔)
读 references/idiom-knowledge-guidelines.md,按其要求:
- 判定成语确被词典收录(查不到 → 拒做并说明);
- 生成 出处/释义/语境/造句/近反义 各字段(有字数上限);
- 安全启示克制判定:能用成语直接讲清一个安全道理才写,绕两层比喻才扯上的 → 填 None 省略;
- 生僻成语(rarity≥3):必填 tips(易错读音/字形),卡片自动出现生僻徽章;
- 出处引文拿不准 → WebSearch 核对汉典/古诗文网,逐字确认。
2. 填数据
往 scripts/card_data.py 的 CARDS 加一个 IdiomCard(...) 条目(文件内有两个完整示例可照抄结构)。
3. 一键出三格式
cd <技能目录>/scripts
"C:/Users/tanhe/.workbuddy/binaries/python/envs/default/Scripts/python.exe" build.py <成语> <输出目录>
validate 报错 → 改文案重跑(断言是防裁切的,不是刁难)。产物:<成语>.html / <成语>.png / <成语>.pptx。
4. 看图质检(必做,不许只看"文件生成了")
- PNG 用 Read 实际看:无裁切、无重叠、层级清晰、印章/徽章/底部行正常;
- PPTX 回渲验收:
bash soffice --headless --convert-to pdf <成语>.pptx --outdir <目录> # pymupdf 渲第一页为图,Read 对比 HTML 截图
字体度量差异导致的 1~2px 位移正常;文字换行位置大幅不同、行溢出、内容重叠才是真问题。
踩过的坑(必须遵守)
- python-pptx:所有 run 必须放同一段落。逐 run 开新段落会让底部行文字逐 run 换行、溢出重叠(实测踩过)。
_textbox()已封装,别改回逐段。 - Playwright 截图临时文件名必须以
.png结尾——它按扩展名判 mime,.tmp后缀直接被拒。render_png.py 用.tmp.png先渲后替换,防止失败覆盖可用产物。 - python-pptx 中文字体必须写
a:ea东亚属性,只设font.name只写了 latin。_set_font()已封装。 - 形状自带主题投影/描边:
_no_style()删p:style+shadow.inherit=False,新画形状一律走_rect/_round封装。 - 版式容量与字数上限是联动的:改 spec.py 的坐标/字号后,必须同步改
build.py validate()的上限与 guidelines 的表格,否则断言失效、卡片裁切。 - 卡高是按最长合法内容定的:某字段常超限说明是文案没压缩,先改文案;确需放宽,先看图确认新高度不挤底部区。
- 底部行(近反义/安全启示/生僻提示)由
spec.bottom_rows(card)动态排布,HTML 与 PPTX 共用同一函数取坐标——不要在某一侧手写 y 值,否则两格式排版分叉。
交付前检查清单
- [ ] 成语经词典收录判定;出处引文逐字核实
- [ ] validate() 零报错(字数全在限内;生僻成语有 tips;安全启示要么 ≥10 字要么 None)
- [ ] PNG 用 Read 看过:无裁切、无重叠、徽章/印章正常
- [ ] PPTX 回渲 PDF 看过:与 HTML 排版一致、文字完整(LibreOffice 度量差异 <2px 属正常)
- [ ] 三格式文件名一致,内容同源(未在任何渲染脚本里手写成语文字)
- [ ] 拿不准的知识点已在交付说明里显式列出