Installs into .claude/skills of the current project.
Are you the author of Md Pptx?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/dewil-md-pptx)
---
name: md-pptx
description: Собрать презентацию .pptx из markdown - слайды: "сделай презентацию", "собери слайды", "нужен pptx для показа". Документы - `md-docx`/`md-pdf`, таблицы - `csv-xlsx`.
---
# md-pptx
Сборка .pptx из markdown без сторонних пакетов: zip + PresentationML руками, как md-docx. Скрипт-эталон - `scripts/md-pptx.py` (top-level папка `scripts/` в корне проекта). Формат 16:9, текст - в текстбоксах (не в плейсхолдерах темы - намеренно, меньше схемной связности).
Соседний `scripts/md-pdf.py` обязателен: из него через стандартную библиотеку загружаются `strip_html_comments` и `inline`. Общие функции удаляют комментарии вне кода и разбирают инлайн-разметку. Адаптер PPTX переводит полученный HTML в текст, жирный, курсив и моноширинный стиль, декодирует сущности; ссылки сохраняют видимый текст без кликабельных отношений, картинки не встраиваются. Раскладка слайдов, таблицы и уровни буллетов остаются в PPTX.
Если `md-pdf.py` отсутствует, сборка завершается с кодом 1 до записи выхода; прежний PPTX сохраняется. Возьми `scripts/md-pdf.py` из канона проекта и положи рядом с `md-pptx.py`.
## Когда применять
- Из готовой заметки/плана нужны слайды для показа или отправки.
- Каркас презентации, который человек потом доведет в PowerPoint/Keynote (наш файл - честная точка старта, не финальный дизайн).
## Когда НЕ применять
- Документ для чтения - это md-pdf или md-docx, не слайды.
- Дизайнерская презентация (брендинг, картинки, анимации) - скрипт дает текстовый каркас; оформление делается человеком в редакторе поверх.
## Раскладка markdown по слайдам
```markdown
# Название доклада <- титульный слайд (один; абзацы до первого ## - подтитул)
## Первый слайд <- слайд с заголовком
- пункт <- буллет
- вложенный <- второй уровень (отступ 2+ пробела)
1. нумерованный <- тот же буллет: нумерация не сохраняется намеренно
(порядок на слайде виден, а перенумерация при правках - шов)
абзац <- текст без буллета
**жирный** *курсив* `код` <- инлайн-разметка работает
--- <- слайд без заголовка ("Вопросы?", переходный)
| A | B | <- markdown-таблица становится таблицей слайда
|---|---| (шапка жирная с заливкой, границы серые)
| 1 | 2 |
```
**HTML-комментарии (`<!-- ... -->`) на слайды не попадают** - вырезаются, число сообщается в stderr. В коде остаются: в fenced-блоке (оба забора, с любым отступом и незакрытый) и в inline-бэктиках - там это пример, а не заметка. Полагаться на комментарии как на единственную защиту служебного не стоит: исходник могут отдать получателю как есть.
Второй `# H1` титулом не становится - идет обычным слайдом. `### H3` - жирная строка внутри текущего слайда. Fenced code (```` ``` ````) - содержимое идет моноширинным текстом, `##` и `---` внутри блока структуру не меняют. Инлайн-разметка следует общему `inline` из `md-pdf.py`; экранированные маркеры звездочки, подчеркивания и обратной кавычки выводятся буквально.
**Таблицы.** Строки вида `| a | b |` собираются в настоящую таблицу pptx (`a:tbl`), а не в текст с трубами: строка-разделитель `|---|---|` помечает шапку и в тело не идет, ширина колонок делится поровну, границы и заливка шапки заданы в самих ячейках (тема таблиц - отдельная часть пакета, без нее PowerPoint нарисовал бы таблицу без линий). Текст и таблицы на слайде идут в порядке исходника. Инлайн-разметка внутри ячеек работает; объединенные ячейки и переносы строк внутри ячейки - нет.
## CLI
```bash
python3 scripts/md-pptx.py доклад.md # доклад.pptx рядом
python3 scripts/md-pptx.py план.md --out слайды.pptx --title "Спринт 3"
python3 scripts/md-pptx.py доклад.md --author "Имя"
```
Автор и заголовок - по `rules/document-metadata.md`: `--author` -> `DOC_AUTHOR` -> `PPTX_AUTHOR` -> `dwl`; `--title` / первый H1 / имя файла. Проверка: `unzip -p слайды.pptx docProps/core.xml`.
## Грабли
- **Слайд не резиновый.** Переполнение ужимается автофитом, а не обрезается, причем пересчет делает PowerPoint при открытии - LibreOffice/Keynote могут показать переполнение как есть. И даже сработавший автофит - это мелкий текст, то есть провал верстки. Длинную секцию дели на несколько `##`; ориентир - до 7-8 буллетов на слайд.
- **Проверяй раскладку по структуре, не по бинарнику.** Число слайдов печатается в выводе (`слайдов: N`); считать его по исходнику надо аккуратно: каждый `#`/`##` вне код-блоков дает слайд, `---` - только если после него до следующего заголовка есть текст (пустые слайды не рисуются), плюс текст до первого заголовка - отдельный слайд без титула. Содержимое конкретного слайда - `unzip -p out.pptx ppt/slides/slide2.xml`. Глазами файл смотрит пользователь.
- **Картинок нет намеренно** (v1). Нужны - скажи пользователю честно, что скрипт их не вставит; регулярная нужда - повод расширять канон, а не встраивать молча.
- Перед перезаписью чужого .pptx - копия в scratchpad (как у md-pdf).
## Связанные файлы
- `scripts/md-pptx.py` в корне проекта - эталонный скрипт.
- Скиллы-соседи по документам: `md-docx` (Word), `md-pdf` (PDF), `csv-xlsx` (таблицы).
- `rules/document-metadata.md` - свойства генерируемых документов.