# Диалект Markdown md2gost — полная спецификация Справочник синтаксиса конвертера md2gost (Markdown → DOCX по ГОСТ 7.32-2017 и ТЗ РТУ МИРЭА). Всё, что здесь описано, извлечено из кода парсера, нумератора и проверки, а не из пользовательских инструкций. Базовый парсер — Marko с расширением GFM. Всё, что не перечислено ниже как расширение, работает как обычный GitHub Flavored Markdown. --- ## 1. Расширения относительно обычного Markdown | Конструкция | Смысл | |-------------|-------| | `# *ЗАГОЛОВОК` | раздел без автоматической нумерации | | `[TOC]` | точка сборки содержания | | `%id Подпись` | метка и подпись следующего объекта | | `![alt](path "%id Подпись")` | метка и подпись рисунка-файла | | `@Тип:id` | перекрёстная ссылка с автоподстановкой номера | | `[1]: описание` | запись списка источников | | `[1]`, `[2, 3]`, `[2, c. 21-25]` | ссылка на источник в тексте | | `^` / `>` в ячейке таблицы | объединение ячеек | | ` ```uml `, ` ```mermaid `, ` ```idef0 `, ` ```dfd `, ` ```uml-<схема>` | диаграмма, отрисовываемая конвертером | | ` ```title ` | данные для автогенерации титульного листа | | `+listing`, `+landscape` в строке `%` | флаги оформления объекта | --- ## 2. Заголовки Синтаксис: от нуля до трёх ведущих пробелов, затем `#`…`######`, пробел, текст. Регулярное выражение парсера: `^ {0,3}(#{1,6})((?=\s)[^\n]*?|[^\n\S]*)(?:(?<=\s)(?` или `>>` | ячейка — продолжение ячейки **слева** (colspan) | Маркер должен быть **единственным** содержимым ячейки после обрезки пробелов. Ограничения проверки: маркеры запрещены в строке заголовков (`table.merge_header`), `>` запрещён в первом столбце (`table.merge_col`). ```markdown %tab_req Требования к системе | Категория | Требование | |-----------|------------| | Производительность | обработка 1000 заявок в час | | ^ | время отклика не более 2 с | | Надёжность | доступность 99,5 % | ``` ### Правила ТЗ - Графа «№ п/п» запрещена (`table.nopp`, шаблон `№\s*п\s*/\s*п`). - Таблицу из одной строки данных не оформляют таблицей. - Таблицы и рисунки не размещают внутри списков. ### Продолжение на следующей странице DOCX не умеет сам подписывать «Продолжение Таблицы N». Режимы `--table-continuation` и `--listing-continuation`: `word` (по умолчанию; после сохранения Word COM режет по реальной пагинации), `off`, `soft`, `legacy`, `caption`. Режим `word` требует Windows, Microsoft Word и пакет `pywin32`. --- ## 7. Листинги Любой fenced-блок с языком, который **не** является языком диаграммы, становится Листингом. ~~~markdown %code_volume Процедура расчёта объёма ```python def volume(count: int, size: float) -> float: return count * size ``` ~~~ Подсветка синтаксиса включается ключом `--syntax-highlighting` (по умолчанию выключена). ### Ловушка: автозамена внутри кода Препроцессор применяет типографские правки ко всему тексту, **исключая только блоки диаграмм**. Блоки кода не защищены: | В исходнике | В DOCX | |-------------|--------| | `print("hello")` | `print(«hello»)` | | `x = a - b` | `x = a — b` | Обход: одинарные кавычки в примерах кода и вычитание без пробелов (`a-b`). Ключ `--emdash-to-hyphen` меняет направление замены тире, но кавычки правит всегда. --- ## 8. Формулы | Форма | Шаблон | Назначение | |-------|--------|------------| | Выключная | `\$\$([\S\s]*?)\$\$` | отдельный блок, нумеруемая формула | | Инлайновая | `\$(.*?)\$` | обозначения в тексте: `$N$` | ```markdown %eq_volume $$ V = N \times S $$ где $N$ — число записей; $S$ — средний размер записи, байт. Оценка по (@Формула:eq_volume) используется при выборе хранилища. ``` Номер присваивается только при наличии ссылки. Расшифровка обозначений начинается со слова «где» без двоеточия. --- ## 9. Диаграммы Fenced-блок с языком диаграммы превращается в Рисунок; исходник отрисовывается конвертером. ### Встроенные языки | Оградка | Движок | |---------|--------| | `uml`, `plantuml` | PlantUML (java + `plantuml.jar`, иначе Kroki) | | `mermaid`, `mmd` | локальный Mermaid (браузер / QuickJS), иначе Kroki | | `idef0`, `uml-idef0` | локальный рендер на Pillow, без Java и сети | | `dfd`, `uml-dfd`, `data-flow-diagram`, `yourdon`, `uml-yourdon` | пакет `data-flow-diagram` + Graphviz, иначе Kroki | ### Схемы из `md2gost.schemes.json` Оградка `uml-` или просто ``, где `` — идентификатор схемы (`^[a-z][a-z0-9_]*$`). Встроенные схемы: | id | Что это | Оградка | |----|---------|---------| | `c4` | C4 Container | ` ```uml-c4 ` / ` ```c4 ` | | `c4context` | C4 System Context | ` ```uml-c4context ` | | `c4component` | C4 Component | ` ```uml-c4component ` | | `usecase` | UML Use Case | ` ```uml-usecase ` / ` ```usecase ` | | `archimate` | ArchiMate 3.2 | ` ```uml-archimate ` / ` ```archimate ` | В теле схемы пишутся **только макросы**: обёртку `@startuml` … `@enduml` и `!include` подставляет схема. В блоке ` ```uml ` наоборот — `@startuml` … `@enduml` обязательны. Неизвестный `uml-` даёт ошибку рендера: `Схема диаграммы «» не найдена`. Подробный синтаксис всех нотаций — в `diagrams.md`, ArchiMate — в `archimate.md`. --- ## 10. Источники ### Запись списка Шаблон строки: `^\[(\d+(?:\.\d+)?)\]:\s*(.+)$` Записи размещаются под заголовком, совпадающим с `^#\s*\*?\s*СПИСОК\s+ИСПОЛЬЗОВАНН?ЫХ\s+ИСТОЧНИКОВ\s*$` — то есть «СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ» или «СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ». ```markdown # *СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ [1]: Иванов И. И. Проектирование информационных систем: учебник. — М.: Инфра-М, 2023. — 320 с. [2]: ГОСТ 7.32-2017. Отчёт о научно-исследовательской работе. — М.: Стандартинформ, 2018. — 32 с. ``` Препроцессор сам расставит пустые строки между записями, но безопаснее писать их сразу. Для ВКР список делится подразделами `##`; ключ записи получает вид `[1.5]` — номер раздела и номер внутри раздела. ### Ссылка в тексте Шаблон: `\[(\d+(?:\.\d+)?(?:\s*,\s*\d+(?:\.\d+)?)*)(?:\s*,\s*[cс]\.\s*[\d\-–]+)?\]` | Форма | Пример | |-------|--------| | одиночная | `[1]`, `[1.5]` | | перечисление | `[2, 3]`, `[2,3]` | | с указанием страниц | `[2, c. 21-25]`, `[2.18, с. 21–25]` — буква `c` латинская или русская | В DOCX номер становится внутренней гиперссылкой на запись списка. Сноски `[^1]` запрещены (`footnote`). --- ## 11. Приложения ```markdown # *ПРИЛОЖЕНИЯ Приложение А — Листинг модуля обработки заявок Приложение Б — Схема базы данных ## Приложение А Листинг модуля обработки заявок ## Приложение Б Схема базы данных ``` - Заголовок приложения распознаётся шаблоном `^ПРИЛОЖЕНИЕ\s+([А-ЯA-ZЁ])(?:\s+(.+))?$` без учёта регистра. Оформляется как Heading 3 по центру с разрывом страницы; название — отдельной строкой под ним. - Допустимые буквы: `АБВГДЕЖИКЛМНПРСТУФХЦШЩЭЮЯ`. Запрещённые: `Ё З Й О Ч Ь Ы Ъ` (ошибка `appendix.letter`). - Если букву не указать или указать запрещённую, конвертер подставит следующую допустимую по порядку. - При двух и более приложениях после `# *ПРИЛОЖЕНИЯ` нужен перечень обычным текстом, иначе предупреждение `appendix.toc`. Если перечня нет, конвертер вставит его сам, но лучше писать явно. - Объекты внутри приложения нумеруются с буквой приложения: `Рисунок Б.1`. --- ## 12. Блок ` ```title ` Первый блок с оградкой `title` в файле вырезается до разбора markdown и используется для автогенерации титульного листа (только при `--auto-title`). ````markdown ```title number: 1 year: 2026 ``` # *СОДЕРЖАНИЕ [TOC] ```` Тело — плоские строки `ключ: значение`. Принимаемые ключи: | Поле | Ключи | |------|-------| | Институт | `institute`, `институт`, `инститиут` | | Кафедра | `department`, `кафедра` | | Дисциплина | `discipline`, `дисциплина` | | Преподаватель | `teacher`, `преподаватель`, `преподователь` | | Должность преподавателя | `teacher_position`, `должность`, `должность преподавателя` | | Номер работы | `number`, `номер`, `№`, `n` — по умолчанию `1` | | Год | `year`, `год` — по умолчанию текущий | ФИО и группа студента **из блока не читаются**: они берутся из профиля приложения или ключей `--student` / `--group`. Остальные академические поля можно держать в файле `info_conv.yaml` рядом с `.md`; значения из блока ` ```title ` сильнее. --- ## 13. Автоматические правки текста Препроцессор применяет ко всему тексту, **кроме блоков диаграмм**: | Правило | Было | Стало | |---------|------|-------| | Русские кавычки | `"текст"` | `«текст»` | | Тире вместо дефиса между словами | `слово - слово` | `слово — слово` | | Разделение записей списка источников | склеенные строки `[n]:` | каждая записью-абзацем | Кавычки не заменяются, если содержимое начинается с `%` (защита строк подписей). Ключ `--emdash-to-hyphen` включает обратную замену: все `—` становятся `-`. --- ## 14. Прочее | Конструкция | Поведение | |-------------|-----------| | `---`, `***`, `___` | по умолчанию **игнорируются**; с ключом `--hr-pagebreak` дают разрыв страницы | | Обычные `**жирный**`, `*курсив*`, `` `код` ``, ссылки, списки | работают как в GFM | | HTML-блоки | не поддерживаются, вставляются как предупреждение в документ | | Комментарии | синтаксиса комментариев нет | | Заголовок глубже `###` | парсится, но в оформлении ТЗ не предусмотрен | | Дефис в обычном тексте | превращается в неразрывный дефис | --- ## 15. Полный минимальный пример ~~~markdown # *СОДЕРЖАНИЕ [TOC] # *ВВЕДЕНИЕ Цель работы — спроектировать модуль учёта заявок. # 1 Анализ предметной области Обобщённая архитектура приведена на @Рисунок:fig_arch. ![Архитектура](images/arch.png "%fig_arch Архитектура информационной системы") Сравнение подходов сведено в @Таблица:tab_cmp. %tab_cmp Сравнение подходов к реализации | Подход | Трудоёмкость | Гибкость | |--------|--------------|----------| | Монолит | низкая | низкая | | Микросервисы | высокая | высокая | Модульная структура описана в источнике [1]. # 2 Проектирование Оценка объёма данных выполняется по (@Формула:eq_volume). %eq_volume $$ V = N \times S $$ где $N$ — число записей; $S$ — средний размер записи, байт. Реализация приведена в @Листинг:code_volume. %code_volume Процедура расчёта объёма ```python def volume(count: int, size: float) -> float: return count * size ``` # *ЗАКЛЮЧЕНИЕ Спроектирован модуль учёта заявок, оценён объём хранилища. # *СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ [1]: Иванов И. И. Проектирование информационных систем: учебник. — М.: Инфра-М, 2023. — 320 с. ~~~