Release standalone PPT template workflow 0.5.0

This commit is contained in:
2026-10-10 21:02:47 +08:00
commit 4e3271ff62
303 changed files with 190946 additions and 0 deletions
@@ -0,0 +1,82 @@
"""scaffold: turn a slide library into an editable fill-plan skeleton."""
from __future__ import annotations
from typing import Any
def scaffold_plan(
library: dict[str, Any],
selected_slides: list[int] | None = None,
*,
include_empty: bool = False,
) -> dict[str, Any]:
"""Build an editable fill plan skeleton from a slide library."""
selected = set(selected_slides or [])
source_slides = library.get("slides", [])
if not selected:
source_slides = source_slides[: min(6, len(source_slides))]
else:
source_slides = [slide for slide in source_slides if int(slide["slide_index"]) in selected]
slides: list[dict[str, Any]] = []
for slide in source_slides:
replacements = []
for slot in slide.get("slots", []):
if not include_empty and not str(slot.get("text") or "").strip():
continue
replacements.append(
{
"slot_id": slot["slot_id"],
"old_text": slot["text"],
"text": slot["text"],
}
)
table_edits = []
for table in slide.get("tables", []):
table_edits.append(
{
"table_id": table["table_id"],
"cells": [
{
"row": cell["row"],
"col": cell["col"],
"old_text": cell["text"],
"text": cell["text"],
}
for row in table.get("rows", [])
for cell in row.get("cells", [])
],
}
)
chart_edits = []
for chart in slide.get("charts", []):
chart_edits.append(
{
"chart_id": chart["chart_id"],
"categories": chart.get("categories", []),
"series": chart.get("series") or [{"name": "系列1", "values": []}],
}
)
slides.append(
{
"source_slide": slide["slide_index"],
"purpose": slide.get("page_type", "content_candidate"),
"layout_rationale": {
"layout_pattern": "",
"why_fit": "",
"risk": "",
},
"replacements": replacements,
"table_edits": table_edits,
"chart_edits": chart_edits,
}
)
return {
"schema": "template_fill_pptx_plan.v1",
"status": "draft",
"source_pptx": library.get("source_pptx"),
"accepted_warnings": [],
"slides": slides,
}