1仕組みと動作原理
docx/xlsx と同一のコンテナ思想:`.pptx` も ZIP+XML であり、タスクに応じてルートを選択します。新規作成は pptxgenjs(npm)によるプログラム生成、既存・テンプレート編集は unzip → slideN.xml 修正 → zip、読み取りは markitdown を使用します。
A `.pptx` is a ZIP archive of XML files. Choose your approach by task:
構造操作は手動コピーではなくスクリプト経由が必須:add_slide.py がスライド/レイアウトの複製とパッケージ内登録(rels/content-type/sldIdLst)の補完を担当し、clean.py が孤立コンポーネントを削除します。ファイルレベルの一貫性はツールにより担保されます。
`add_slide.py` does every registration a new slide needs and reports what it made
生成側の注意点(pptxgenjs の落とし穴)が極めて詳細:カラーコードの '#' や 8 桁 16 進数の禁止、不透明度は transparency を使用、シャドウの offset ≥ 0、リスト項目は bullet:true、複合グラフは valAxes + catAxes の二軸宣言が必須、dataLabelPosition outEnd によるファイル破損など。すべて validate.py で最終検証されます。
It reports the two chart faults above and the slide-XML defects PowerPoint refuses, and names the fix for each.
グラフ戦略は「ネイティブ可能なものは絶対に画像化しない」:PowerPoint が描画可能なものは addChart() を使用し、ライブラリ非対応機能(近似曲線/誤差範囲)は自前で series を計算するか OOXML を後処理します。PowerPoint にネイティブ形式が存在しない図(サンキー/ネットワーク/コードダイアグラム)のみ画像化して挿入します。
Use `addChart()` for everything PowerPoint can chart
テンプレート編集における XML セキュリティ要件:変換処理は必ず defusedxml.minidom でパースし、xml.etree は禁止(名前空間プレフィックスが書き換えられファイルが破損するため)。テンプレートのスロット数 ≠ 入力項目数(例:4 人用テンプレートに 3 人を配置する場合、文字だけを消すのではなくグループごと削除)。
If you script an XML transform, parse with `defusedxml.minidom` — round-tripping OOXML through `xml.etree.ElementTree` rewrites namespace prefixes and corrupts the deck.
3 段階の必須 QA:コンテンツ QA(markitdown テキスト確認 + プレースホルダー残骸 grep)、ファイル QA(validate.py 必須実行、テンプレート派生ファイルは --original でベースライン比較)、視覚 QA(soffice で PDF 変換 → pdftoppm で画像化し全スライド目視確認、別視点を持つ subagent の活用を推奨)。
After staring at the generating code you tend to see what you expect rather than what rendered, so look at the images fresh (a subagent works well for this if you have one)
デザイン層に組み込まれた「アンチ AI スロップ(安っぽい AI 感の排除)」指針:テーマパレットの先行決定、60〜70% のドミナントカラー比率、カラーバーや下線モチーフの回避、デフォルトの青やクリーム背景の禁止、フォントの QA 信頼性 2 分類(LibreOffice での文字幅差異によるレイアウト崩れ誤認を防止)。
**NEVER use accent lines under titles** — these are a hallmark of AI-generated slides
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | pptxgenjs(npm,deck 生成) |
| package | markitdown[pptx] / Pillow / defusedxml / lxml(pip:文本转储/缩略图/clean/validate) |
| package | react-icons / react / react-dom / sharp(npm,图标管线,条件安装) |
| cli | LibreOffice soffice(视觉 QA 渲染/.ppt 转换,经 soffice.py 包装) |
| cli | pdftoppm(Poppler,出图) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: add_slide.py / clean.py / thumbnail.py / validate.py / soffice.py(同梱の Python
- 本地工作目录: ファイル I/O と成果物出力: deck/out.pptx、unpacked/ 展開ディレクトリ、サムネイル jpg、soffice.py tempdir の C ソース/shim/プロファイルを出力
5二重目の独立検証
- [ok] office/ 树与 docx/xlsx 一致 — diff -rq 三目录 office/ 零差异;soffice.py/validate.py 为同一文件副本。
- [ok] add_slide/clean/thumbnail 行为声明 — SKILL.md 表与正文描述(注册报路径、孤儿清理、labeled 网格)与各脚本 docstring/实现相符。
- [ok] pptxgenjs 坑清单与 validate 兜底 — 'corrupts the file' 类规则 + 'After writeFile(), run validate.py' 原文在;validate.py 确有 chart/slide 检查逻辑。
- [ok] defusedxml 安全解析 — SKILL.md 明文禁止 xml.etree 做变换并指定 defusedxml.minidom;脚本中实际使用 defusedxml。
- [ok] 网络/凭证零命中 — 脚本无网络调用;环境变量仅 soffice.py 拷贝环境设 VCL 插件与 LD_PRELOAD(无读取密钥)。
- [ok] 夸大检查 — description 'any time a .pptx or .potx file is involved'——正文覆盖 create/edit/template/read/QA 全链,无越界承诺;设计指导属 prompt 层(依赖模型遵循+validate 兜底)。
- [ok] 元数据 — 本地 HEAD==pin 41bbe19;LICENSE 专有与 frontmatter 'Proprietary' 一致。
6結論
fa29d7374c319c8e…