83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
"""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,
|
|
}
|