--- name: ppt-editing-skill description: "Edit existing PowerPoint files or templates with XML-safe workflows. Use for template-based deck updates: analyze layouts, map content to slides, duplicate/reorder/delete slides safely, edit slide XML in parallel, clean orphaned assets, and repack validated PPTX output." license: Proprietary. LICENSE.txt has complete terms --- # Editing Presentations ## Template-Based Workflow When using an existing presentation as a template: 1. **Copy and analyze**: ```bash cp /path/to/user-provided.pptx template.pptx python -m markitdown template.pptx > template.md ``` Review `template.md` to see placeholder text and slide structure. 2. **Plan slide mapping**: For each content section, choose a template slide. ⚠️ **USE VARIED LAYOUTS** — monotonous presentations are a common failure mode. Don't default to basic title + bullet slides. Actively seek out: - Multi-column layouts (2-column, 3-column) - Image + text combinations - Full-bleed images with text overlay - Quote or callout slides - Section dividers - Stat/number callouts - Icon grids or icon + text rows **Avoid:** Repeating the same text-heavy layout for every slide. Match content type to layout style (e.g., key points → bullet slide, team info → multi-column, testimonials → quote slide). 3. **Unpack** 4. **Build presentation** (do this yourself, not with subagents): - Delete unwanted slides (remove from ``) - Duplicate slides you want to reuse (`add_slide.py`) - Reorder slides in `` - **Complete all structural changes before step 5** 5. **Edit content**: Update text in each `slide{N}.xml`. **Use subagents here if available** — slides are separate XML files, so subagents can edit in parallel. 6. **Clean** 7. **Pack** ## Output Structure Copy the user-provided file to `template.pptx` in cwd. This preserves the original and gives a predictable name for all downstream scripts. ```bash cp /path/to/user-provided.pptx template.pptx ``` ```text ./ ├── template.pptx # Copy of user-provided file (never modified) ├── template.md # markitdown extraction ├── unpacked/ # Editable XML tree └── edited.pptx # Final repacked deck ``` Minimum expected deliverable: `edited.pptx`. --- ## Scripts | Script | Purpose | |--------|---------| | `unpack.py` | Extract and pretty-print PPTX | | `add_slide.py` | Duplicate slide or create from layout | | `clean.py` | Remove orphaned files | | `pack.py` | Repack with validation | Removes slides not in ``, unreferenced media, orphaned rels. Always write to `/tmp/` first, then copy to the final path. Python's `zipfile` module uses `seek` internally, which fails on some volume mounts (e.g. Docker bind mounts). Writing to a local temp path avoids this. Validates, repairs, condenses XML, re-encodes smart quotes. --- ## Slide Operations Slide order is in `ppt/presentation.xml` → ``. **Reorder**: Rearrange `` elements. **Delete**: Remove ``, then run `clean.py`. **Add**: Use `add_slide.py`. Never manually copy slide files—the script handles notes references, Content_Types.xml, and relationship IDs that manual copying misses. --- ## Editing Content **Subagents:** If available, use them here (after completing step 4). Each slide is a separate XML file, so subagents can edit in parallel. In your prompt to subagents, include: - The slide file path(s) to edit - **"Use the Edit tool for all changes"** - The formatting rules and common pitfalls below For each slide: 1. Read the slide's XML 2. Identify ALL placeholder content—text, images, charts, icons, captions 3. Replace each placeholder with final content **Use the Edit tool, not sed or Python scripts.** The Edit tool forces specificity about what to replace and where, yielding better reliability. ### Formatting Rules - **Bold all headers, subheadings, and inline labels**: Use `b="1"` on ``. This includes: - Slide titles - Section headers within a slide - Inline labels like (e.g.: "Status:", "Description:") at the start of a line - **Never use unicode bullets (•)**: Use proper list formatting with `` or `` - **Bullet consistency**: Let bullets inherit from the layout. Only specify `` or ``. --- ## Common Pitfalls ### Template Adaptation When source content has fewer items than the template: - **Remove excess elements entirely** (images, shapes, text boxes), don't just clear text - Check for orphaned visuals after clearing text content - Run content QA with `markitdown` to catch mismatched counts When replacing text with different length content: - **Shorter replacements**: Usually safe - **Longer replacements**: May overflow or wrap unexpectedly - Verify with `markitdown` after text changes - Consider truncating or splitting content to fit the template's design constraints **Template slots ≠ Source items**: If template has 4 team members but source has 3 users, delete the 4th member's entire group (image + text boxes), not just the text. ### Multi-Item Content If source has multiple items (numbered lists, multiple sections), create separate `` elements for each — **never concatenate into one string**. **❌ WRONG** — all items in one paragraph: ```xml Step 1: Do the first thing. Step 2: Do the second thing. ``` **✅ CORRECT** — separate paragraphs with bold headers: ```xml Step 1 Do the first thing. Step 2 ``` Copy `` from the original paragraph to preserve line spacing. Use `b="1"` on headers. ### Smart Quotes Handled automatically by unpack/pack. But the Edit tool converts smart quotes to ASCII. **When adding new text with quotes, use XML entities:** ```xml the “Agreement” ``` | Character | Name | Unicode | XML Entity | |-----------|------|---------|------------| | `"` | Left double quote | U+201C | `“` | | `"` | Right double quote | U+201D | `”` | | `'` | Left single quote | U+2018 | `‘` | | `'` | Right single quote | U+2019 | `’` | ### Other - **Whitespace**: Use `xml:space="preserve"` on `` with leading/trailing spaces - **XML parsing**: Use `defusedxml.minidom`, not `xml.etree.ElementTree` (corrupts namespaces)