Release standalone PPT template workflow 0.5.0
This commit is contained in:
@@ -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,
|
||||
}
|
||||
Reference in New Issue
Block a user