---
name: hp-generate-docx
description: >
  Преобразование markdown-файлов проекта Hebrew Harry Potter в форматированный DOCX.
  Используй этот skill, когда пользователь просит сгенерировать Word-документ из
  переведённых страниц, создать DOCX для печати, собрать книгу из markdown,
  или упоминает файлы вида «HP_ch*_translate.md» в контексте создания документа.
  Также используй при любом упоминании «сделай docx», «собери в Word», «подготовь
  для печати» в контексте ивритского Гарри Поттера.
---

# MARKDOWN_TO_WORD

Skill преобразует markdown-файлы проекта Hebrew Harry Potter в DOCX.

Используется в пайплайне подготовки книги.

---

# Входные данные

Skill принимает:

1️⃣ Markdown файл главы — выход скила `hp-translate`

Если скил `hp-translate` ещё не выполнялся — предложить пользователю сначала запустить его.

Формат имени:

HP_ch{CHAPTER}_{FROM}_{TO}_translate.md

Примеры:

references/HP_ch1_30_35_translate.md
references/HP_ch1_36_37_translate.md

Формат страниц внутри markdown:

# Страница N

## Иврит
текст

## Подстрочный перевод
таблица

## Литературный перевод
текст

## Список сложных слов
таблица

## Различия ивритского и русского переводов
таблица

---

2️⃣ Архив с иллюстрациями

ZIP-архив с изображениями страниц. Иллюстрации создаются по промтам из скила `hp-generate-image`: для каждой страницы генерируется промт, по которому в генераторе изображений (ChatGPT / DALL-E и т.п.) создаётся иллюстрация. Готовые изображения собираются в ZIP-архив и подаются на вход этому skill'у.

Каждый файл в архиве должен содержать в имени номер страницы, к которой относится иллюстрация (номер определяется автоматически — см. раздел «Определение номера страницы изображения»).

Поддерживаемые форматы:

png  
jpg  
jpeg  
webp

---

# Определение номера страницы изображения

Номер страницы определяется автоматически.

Алгоритм:

1. Из имени файла извлекаются все числа.
2. Берётся последнее число.
3. Это число считается номером страницы.

Примеры:

36.png → 36  
page_36.png → 36  
Картинка_36.png → 36  
scan_036.jpg → 36  
HP_page_37.png → 37  
illustration37.webp → 37

---

# Результат

Один DOCX файл.

Имя формируется автоматически из имени markdown.

Формула:

HP_ch{CHAPTER}_{FROM}_{TO}_translate.md

↓

Гарри Поттер глава {CHAPTER} страницы {FROM}-{TO}.docx

---

# Пример

HP_ch1_36_37_translate.md

↓

Гарри Поттер глава 1 страницы 36-37.docx

---

# Правила обработки markdown

## Заголовки

В документе остаётся только:

Страница N

Удаляются:

## Иврит
## Подстрочный перевод
## Литературный перевод
## Список сложных слов
## Различия ивритского и русского переводов

---

## Картинки

После заголовка страницы вставляется иллюстрация.

Алгоритм:

1. определяется номер страницы
2. ищется изображение с таким номером
3. изображение вставляется сразу после заголовка

Страница 36 → картинка 36

---

## Таблицы

## Поведение таблиц

Таблицы могут продолжаться на следующей странице.

Строка таблицы не может разрываться между страницами.

Если строка не помещается на текущей странице,
она переносится целиком на следующую страницу.


Markdown таблицы превращаются в таблицы Word.

Заголовки таблиц удаляются.

Для таблиц обязательно используются следующие правила Word:

- таблица занимает 100% ширины текстовой области
- `AutoFit` не используется
- используется фиксированная ширина колонок (`AutoFit = Fixed`)
- ширина колонок распределяется равномерно
- перенос текста внутри ячеек разрешён
- строка таблицы не разрывается между страницами (`Allow row to break across pages = false`)

Форматирование таблицы не должно применяться только «в целом по таблице».

Форматирование должно назначаться:

- на уровне paragraph / cell для направления текста
- на уровне run для шрифта и complex script

Это особенно важно для смешанных таблиц с ивритом и русским.

---

# Типографика

## Картинки

alignment: center  
width: 100% текстовой области

text wrap: none

Отступы:

0 pt сверху  
12 pt снизу

---

## Заголовок страницы

Страница N

font size: 14  
bold  
alignment: center  
spacing after: 0 pt

---

## Основной текст

Иврит:

font: David  
size: 18  
alignment: right

Остальной текст:
font size: 12

---

## Таблицы

ширина: 100% текстовой области страницы
столбцы распределяются равномерно
перенос текста в ячейках разрешён
AutoFit: Fixed

Направление колонок в подстрочном переводе:
- колонка «Иврит» — RTL
- колонка «Перевод» — LTR

### Иврит в таблицах

Если в ячейках таблицы есть текст на иврите, для него обязательно явно задаётся шрифт `David`.

Важно:
- это правило применяется не только к обычному тексту, но и к тексту внутри таблиц
- шрифт должен быть назначен явно для всех runs с ивритом
- для ивритского текста в Word нужно задавать `David` не только как обычный шрифт, но и как complex script / bidi font (`cs`)
- каждый run с ивритом должен быть явно помечен как right-to-left (`rtl`) и complex script (`cs`)
- если библиотека поддерживает bidi/RTL на уровне paragraph или table cell, оно тоже должно быть включено для ячеек с ивритом
- недостаточно только `w:rFonts = David`; для иврита в таблицах также обязательно задаются `w:rtl` и `w:cs` на уровне run
- если в одной ячейке смешаны иврит и русский, шрифт `David` и RTL-markup назначаются только ивритскому фрагменту

Размер и выравнивание иврита в таблицах:
- font: David
- size: 18
- alignment: right
- direction: RTL
- complex script: enabled

### Русский текст в таблицах

Для русского текста в таблицах:
- font: Times New Roman
- size: 12
- alignment: left
- direction: LTR

### Практическое правило

Нельзя ограничиваться установкой только `w:rFonts`.

Для иврита в таблицах одновременно должны быть выставлены:
- обычный шрифт `David`
- complex script font `David`
- `w:rtl`
- `w:cs`

Если в одной ячейке смешаны русский и иврит, форматирование назначается только соответствующим фрагментам текста, а не всей ячейке целиком.

---

# Разрывы страниц

Каждая страница начинается с новой страницы Word.

Перед

# Страница N

вставляется page break.

---

# Поля страницы

верхнее: 2.54 см  
нижнее: 2.54 см  
левое: 2.54 см  
правое: 2.54 см

---

# Validation

Перед генерацией выполняются проверки.

## Проверка имени файла

Имя должно соответствовать:

HP_ch{CHAPTER}_{FROM}_{TO}_translate.md

---

## Проверка страниц

Если файл называется

HP_ch1_36_37_translate.md

то markdown должен содержать

# Страница 36  
# Страница 37

---

## Проверка картинок

Для каждой страницы должна существовать картинка.

Номер страницы извлекается из имени файла изображения.

Если картинки нет:

ERROR: image for page N not found

---

## Проверка количества страниц

Количество блоков

# Страница N

должно совпадать с диапазоном страниц.

Если нет:

ERROR: page count mismatch

---

## Проверка таблиц

Markdown таблицы должны иметь корректную структуру.

Если повреждены:

ERROR: invalid markdown table

---

# Проверка выхода

После генерации DOCX проверить:

- [ ] Документ открывается без ошибок
- [ ] Каждая страница начинается с нового листа Word
- [ ] Иллюстрация присутствует на каждой странице
- [ ] Иврит отображается шрифтом David, 18pt, выравнивание вправо, RTL
- [ ] Заголовки секций (## Иврит, ## Подстрочный перевод и т.д.) удалены
- [ ] Таблицы не разорваны между страницами
- [ ] Смешанный текст (иврит + русский в одной ячейке) корректно отформатирован

---

# Поведение при ошибке

Если ошибка обнаружена:

генерация DOCX останавливается.

Частичный документ не создаётся.

---

# Скрипт

Генерация реализована скриптом `scripts/build_hp_docx.py`.

Зависимости:

```bash
pip install python-docx
```

Запуск:

```bash
python3 scripts/build_hp_docx.py <markdown> <images_zip> [-o output.docx] [--no-render]
```

Примеры:

```bash
python3 scripts/build_hp_docx.py HP_ch3_1_2_translate.md Картинка_1-2.zip
python3 scripts/build_hp_docx.py HP_ch3_1_2_translate.md Картинка_1-2.zip -o out.docx
python3 scripts/build_hp_docx.py HP_ch3_1_2_translate.md Картинка_1-2.zip --no-render
```

По умолчанию после генерации DOCX запускается рендер через LibreOffice. Флаг `--no-render` пропускает этот шаг.

---

# References

references/HP_ch1_30_35_translate.md
references/HP_ch1_36_37_translate.md
