Files
SSAUGenerator/docx/AGENTS.md
StepanovPlaton bf7816ab7c Rename project to SSAU Generator and restructure content
- Move projects into content/<project>/{docx,pptx} with shared assets/
- Flatten config paths; output = project name in project folder
- Add pptx --init scaffold; remove docx exe build
- Add feature-complete content/example; ignore content/* except example
- Rewrite README and AGENTS.md
2026-10-11 23:25:22 +04:00

317 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — работа с документом DOCX
Генератор `docx/` собирает отчёт в формате **DOCX** из обычных **Markdown**-файлов
по фиксированному дизайну СТО 02068410-004-2018. Этот файл — инструкция агенту по
созданию и правке конкретного документа. Поведение полностью задаётся `config.yaml`
проекта, менять код генератора не нужно.
## 1. Требования
- Node.js 18+, зависимости ставятся командой `npm install` в папке `docx/`.
- Windows/macOS/Linux.
- Готовые PNG вставляются без внешних зависимостей. Для рендеринга PlantUML
(`.puml`) нужны Java 11+ и файл `plantuml.jar` (см. `plantuml` в конфиге).
## 2. Раскладка проекта
Проект лежит в `content/<проект>/docx/` рядом с `config.yaml`:
```
content/<проект>/
├── assets/ # общие ресурсы проекта (общие с pptx)
│ ├── title-page.docx # титульный лист
│ └── images/ # PNG-рисунки и исходники .puml
└── docx/
├── config.yaml # настройки документа
├── 01-introduction.md
├── 02-*.md
└── 05-bibliography.md
```
Все относительные пути в `config.yaml` считаются **от каталога самого
`config.yaml`**. Если ресурсы общие с презентацией, указывайте их через `../assets`
(например, `paths.assets: ../assets`, `document.titlePage: ../assets/title-page.docx`).
Отчёт собирается в папку проекта и называется по имени проекта:
`content/<проект>/<проект>.docx`. Значение ключа `document.output` при такой
раскладке — `../<проект>.docx`.
Структуру проекта создавайте командой `--init`: она формирует `config.yaml`,
примеры `*.md` и общий каталог `content/<проект>/assets/` (титульный лист,
изображения), который используется и генератором `pptx`.
Готовый пример со всеми возможностями — `content/example/docx/`.
## 3. Командная строка
Из корня репозитория:
```
node docx/src/cli.js [опции]
--config <путь> путь к config.yaml (по умолчанию config.yaml в текущем каталоге)
--content <dir> каталог проекта: config.yaml, *.md и assets/ (по умолчанию текущий)
--output <путь> переопределить путь выходного .docx
--check только проверить конфиг и ссылки, без записи файла
--init создать шаблон config.yaml/*.md/assets и выйти
--verbose подробный вывод
--version показать версию
--help справка
```
Типичный цикл:
```powershell
node docx/src/cli.js --content content/<проект>/docx --init # создать структуру проекта
node docx/src/cli.js --content content/<проект>/docx --check # проверить
node docx/src/cli.js --content content/<проект>/docx # собрать
```
После любого изменения исходников (`config.yaml`, `*.md`, ресурсов `assets/`)
**пересоберите документ**, чтобы результат соответствовал исходникам.
Если `config.yaml` не найден, инструмент сам создаёт шаблон (`config.yaml`,
примеры Markdown и общий `assets/`) и завершается.
## 4. Схема `config.yaml`
Любой ключ можно опустить — берётся значение по умолчанию (см.
`docx/src/config/defaults.js`).
### document
| Ключ | Тип | Смысл |
|------|-----|-------|
| `output` | string | путь выходного `.docx` (относительно `config.yaml`) |
| `titlePage` | string/null | путь к готовому `title-page.docx`; `null` — без титульника |
| `features.updateFields` | bool | обновлять поля (в т.ч. оглавление) при открытии в Word |
Титульный лист склеивается перед документом, между ним и текстом вставляется
разрыв страницы. При `--init` создаётся пример `assets/title-page.docx`.
### paths
| Ключ | Смысл |
|------|-------|
| `assets` | корень ресурсов; `file=images/x.png` в директивах ищется здесь |
### Структура и оформление
| Раздел | Назначение |
|--------|-----------|
| `page` | `width`, `height` (DXA), `margins` (twips) |
| `typography` | `font`, `sizeBody`/`sizeTable`/`sizeSmall`, `lineSpacing`, `color`, `useBold`, `allowEmphasis`, `language` |
| `headings` | интервалы/выравнивание `struct`, `section`, `subsection`, `point` |
| `captions` | префиксы и тире подписей `figure`, `table`, `tableContinue` |
| `lists` | `bulletChar`, `letterSuffix`, `numberSuffix`, `nestedLevelStep`, `forbiddenLetters` |
| `numbering` | `figures`, `tables`, `formulas`: `global` или `section` |
| `formula` | `spacingBeforeAfter`, `whereTabPosition` |
| `table` | `font`, `size`, `borderColor`, `borderSize`, `cellMargins`, `headerFill`, `cellFill` |
| `figure` | `maxWidth` (px, `null` — по ширине), `maxHeight` (px) |
| `pageNumber` | `align`, `format`, `startFrom` |
| `toc` | `enabled`, `title`, `depth` (1..3) |
| `bibliography` | `title` |
| `citation` | `bracketOpen`, `bracketClose`, `pagePrefix` |
| `appendix` | `labelPrefix`, `forbiddenLetters` |
### plantuml
| Ключ | Тип | Смысл |
|------|-----|-------|
| `enabled` | bool | включить рендеринг `.puml`; `false` — считать ошибкой |
| `java` | string | `auto` — `%JAVA_HOME%\bin\java`, иначе `java` из PATH |
| `jar` | string | путь к `plantuml.jar` (относительно `config.yaml`) |
| `format` | string | только `png` |
| `charset` | string | кодировка исходника (по умолчанию `UTF-8`) |
| `cache` | bool | не перерисовывать неизменённый исходник |
| `cacheDir` | string | каталог кэша PNG (относительно `config.yaml`) |
| `timeoutMs` | int | таймаут рендера одной диаграммы, мс |
Общий `plantuml.jar` репозитория лежит в `tools/plantuml.jar`; из проекта путь
вида `../../../tools/plantuml.jar`. Ошибки рендера (нет `jar`, нет Java,
синтаксическая ошибка) — фатальные: сборка останавливается с кодом `1`.
### sections — структура документа
Упорядоченный список частей:
```yaml
sections:
- { type: toc } # поле оглавления
- { file: 01-introduction.md, type: structural, title: Введение }
- { file: 02-main.md, type: numbered } # # = 1, ## = 1.1, ### = 1.1.1
- { file: 04-conclusion.md, type: structural, title: Заключение }
- { file: 05-bibliography.md, type: bibliography }
- { file: 06-appendix-a.md, type: appendix, letter: А, title: Приложение }
```
| type | Поведение |
|------|-----------|
| `toc` | вставляет оглавление (не требует `file`) |
| `structural` | ненумерованный раздел (Введение/Заключение): заголовок = `title`, ЗАГЛАВНЫМИ, по центру, с новой страницы |
| `numbered` | нумеруемый раздел; `#` = раздел, `##`/`###` = подраздел/пункт |
| `bibliography` | список источников; нумеруется автоматически |
| `appendix` | приложение: заголовок «ПРИЛОЖЕНИЕ <letter>» + `title`, буквенный префикс у рисунков/таблиц |
## 5. Формат контента
### Заголовки
В файле `type: numbered`:
```md
# НАЗВАНИЕ РАЗДЕЛА -> 1 НАЗВАНИЕ РАЗДЕЛА (с новой страницы)
## Подраздел -> 1.1 Подраздел
### Пункт -> 1.1.1 Пункт
```
Номера подставляются автоматически (Word-numbering). В `structural`/`appendix`
заголовок берётся из `title`, а заголовки внутри файла рендерятся без номера.
### Абзацы и списки
Обычные абзацы и списки Markdown. Пример:
```md
- первый пункт;
- второй пункт:
1. вложенный пункт (выведется как «а) вложенный пункт»);
2. ещё один.
```
Маркер вложенности выбирается автоматически: тире → `а)` → `1)`. Полужирный и
курсив по умолчанию игнорируются (СТО).
### Таблицы
- Обычная GFM-таблица без директивы — таблица **без подписи и номера**.
- С подписью и автономером — директива `::: table`:
```md
::: table "Название таблицы" id=params note="примечание"
| Параметр | Значение |
|---|---|
| A | 1 |
| B | 2 |
:::
```
### Рисунки
```md
::: figure "Название рисунка" id=arch file=images/arch.png
а) первый поясняемый элемент;
б) второй поясняемый элемент.
:::
```
`file` — относительно `paths.assets`. Если файла нет — предупреждение, подпись
всё равно выводится. Подпись ставится под рисунком по центру:
`Рисунок N — Наименование`. Если пояснять нечего, тело директивы оставляют
пустым:
```md
::: figure "Общая схема системы" id=common file=images/common.png
:::
```
**PlantUML.** Если `file` оканчивается на `.puml` (`.plantuml`, `.pu`, `.iuml`),
файл рендерится в PNG через `plantuml.jar` и вставляется как обычный рисунок:
```md
::: figure "Диаграмма последовательности" id=seq file=images/seq.puml
а) запрос клиента;
б) ответ сервера.
:::
```
Ошибка рендера фатальна, `--check` тоже рендерит `.puml`.
В приложениях номер рисунка получает префикс буквы: `Рисунок А.1 — Наименование`.
### Формулы
```md
::: formula id=line
y = a*x + b
:::
::: where
y — результат;
x — аргумент;
a — коэффициент.
:::
```
Поддерживается простой синтаксис: `^` (степень), `_` (индекс), `/` (дробь). Номер
формулы ставится автоматически справа.
### Примечания и термины
```md
::: note
Текст примечания.
:::
::: notes
- первое примечание;
- второе примечание.
:::
::: definitions
Термин — определение;
Ещё термин — определение.
:::
```
### Разрыв страницы
```md
::: pagebreak
:::
```
Тематический разрыв `---` также трактуется как разрыв страницы.
### Ссылки на источники
`[@1]` — ссылка на 1-й источник, `[@1, с. 96]` — с номером страницы. Список
источников — Markdown-список в файле `type: bibliography`; порядок строк = номера.
Ссылка вне диапазона — ошибка в `--check`.
### Перекрёстные ссылки
`@fig:id`, `@tbl:id`, `@eq:id` подставляют актуальный номер рисунка/таблицы/
формулы (например `2`, `1.1`, `А.1`). `id` задаётся в директиве.
### Блоки кода
Fenced-блоки ``` игнорируются с предупреждением (функция листингов удалена).
## 6. Проверка и ошибки
`--check` проверяет:
- корректность `config.yaml` (типы, существование файлов, буквы приложений);
- наличие всех `sections[].file`;
- существование меток в `@fig/@tbl/@eq`;
- диапазон ссылок `[@n]`;
- рендеринг всех `::: figure ... file=*.puml`.
Ошибки печатаются списком и возвращают код выхода `1`. Предупреждения (например,
отсутствующий PNG) не останавливают сборку; ошибки PlantUML — фатальные.
## 7. Подготовка диаграмм
Готовые PNG кладутся в общий каталог ресурсов (`content/<проект>/assets/images/`).
Исходники PlantUML (`.puml`) кладутся туда же и указываются в
`::: figure ... file=images/<имя>.puml`. Диаграммы других форматов (Mermaid,
draw.io) готовятся внешними средствами и вставляются как PNG.
## 8. Замечания по дизайну
- Дизайн фиксирован под СТО 02068410-004-2018; меняются только параметры из
`config.yaml`.
- Полужирный и курсив по умолчанию отключены (`typography.useBold`,
`allowEmphasis`).
- Оглавление — поле Word; при открытии нажмите «Обновить поле» либо включите
`document.features.updateFields`.