md2gost 1.5.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -113,14 +113,17 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
113
113
  * [Картинки](#картинки)
114
114
  * [Листинг](#листинг)
115
115
  * [Таблицы](#таблицы)
116
+ * [Формулы](#формулы)
116
117
  * [Комментарии](#комментарии)
118
+ * [Блоки Admonition](#блоки-admonition)
117
119
  * [Разрыв страницы](#разрыв-страницы)
118
120
  * Дополнительный синтаксис:
119
121
  * [Правила (!!rule)](#правила)
120
122
  * [Оглавление](#оглавление)
121
123
  * [Разрыв раздела](#разрыв-раздела)
124
+ * [Колонтитулы](#колонтитулы)
122
125
  * [Автонумерация](#автонумерация)
123
- * [Вставка docx/pdf (вставка титульника)](#вставка-внешнего-документа)
126
+ * [Вставка DOCX, PDF и Markdown](#вставка-внешнего-документа)
124
127
  * [Автозамены](#автозамены)
125
128
  * Переключаемые функции:
126
129
  * [Подсветка синтаксиса кода](#подсветка-синтаксиса-кода)
@@ -239,19 +242,19 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
239
242
  ![демонстрация разницы переносов строк](https://raw.githubusercontent.com/MixelTe/md2gost/master/imgs/screenshot_linebreaks.png)
240
243
 
241
244
  Выделение с помощью обратных кавычек ``` `монотекст` ``` по умолчанию отображается как курсив. С помощью [правила](#правила) `backtick_mono` можно изменить отображение:
242
- * `!!rule backtick_mono italic` - курсив (по умолчанию)
245
+ * `!!rule backtick_mono italic` – курсив (по умолчанию)
243
246
 
244
247
  ![backtick_mono italic](https://raw.githubusercontent.com/MixelTe/md2gost/master/imgs/backtick_mono_italic.png)
245
248
 
246
- * `!!rule backtick_mono off` - обычный текст
249
+ * `!!rule backtick_mono off` – обычный текст
247
250
 
248
251
  ![backtick_mono off](https://raw.githubusercontent.com/MixelTe/md2gost/master/imgs/backtick_mono_off.png)
249
252
 
250
- * `!!rule backtick_mono on` - моношрифт
253
+ * `!!rule backtick_mono on` – моношрифт
251
254
 
252
255
  ![backtick_mono on](https://raw.githubusercontent.com/MixelTe/md2gost/master/imgs/backtick_mono_on.png)
253
256
 
254
- * `!!rule backtick_mono outline` - моношрифт в рамочке
257
+ * `!!rule backtick_mono outline` – моношрифт в рамочке
255
258
 
256
259
  ![backtick_mono outline](https://raw.githubusercontent.com/MixelTe/md2gost/master/imgs/backtick_mono_outline.png)
257
260
 
@@ -302,6 +305,8 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
302
305
  ![Рисунок 1.5 - Важные зарисовки, с очень длинным названием, <br>которое не умещается в одну строку] (image.png){340}
303
306
  ```
304
307
 
308
+ Если курсор находится на строке с Markdown-картинкой, при вставке изображения из буфера обмена доступно действие **Replace image with …**. Оно сохраняет изображение в той же папке под новым именем с номером (например, `image.png` → `image1.png`) и обновляет путь в Markdown. Исходный файл не перезаписывается. Работает с локальными путями в сохранённом файле.
309
+
305
310
 
306
311
  ### Листинг
307
312
  В отличие от обычного Markdown после кода языка в первой строке пишется заголовок листинга (при разрыве листинга на несколько страниц заголовок продублируется автоматически).
@@ -353,6 +358,29 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
353
358
  | текст | текст | текст |
354
359
  ```
355
360
 
361
+ ### Формулы
362
+
363
+ Формулы записываются в LaTeX-синтаксис. Строчные формулы заключаются в одинарные знаки доллара, а блочные — в двойные. Открывающий и закрывающий маркеры блочной формулы должны находиться на отдельных строках; формулы внутри абзаца при экспорте не считаются блочными. Чтобы вывести знак доллара как обычный символ, экранируйте его обратным слешем: `\$`.
364
+
365
+ ```md
366
+ Скорость равна $v = \frac{s}{t}$.
367
+
368
+ $$
369
+ E = mc^2
370
+ $$
371
+ ```
372
+
373
+ Чтобы указать номер блочной формуле напишите любой текст в круглых скобках на отдельной строке непосредственно перед формулой:
374
+
375
+ ```md
376
+ (А.1)
377
+ $$
378
+ E = mc^2
379
+ $$
380
+
381
+ Как показано в формуле А.1, энергия зависит от массы.
382
+ ```
383
+
356
384
  ### Комментарии
357
385
  Этот текст исчезнет при экспорте. Поддерживаются только отдельно стоящие комментарии.
358
386
  ```md
@@ -363,6 +391,88 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
363
391
  <!-- Исчезнет вся строка --> это тоже исчезнет
364
392
  ```
365
393
 
394
+ ### Блоки Admonition
395
+
396
+ Admonition – это выделенный информационный блок. Синтаксис совместим с [Admonitions в Docusaurus](https://docusaurus.io/docs/markdown-features/admonitions): блок начинается с трёх двоеточий и его типа, а заканчивается строкой из трёх двоеточий.
397
+
398
+ > **Важно:** Admonition не является элементом оформления по ГОСТ. Используйте его в документах, где важнее наглядно отделить примечание, рекомендацию или предупреждение, чем строго следовать ГОСТ.
399
+
400
+ Поддерживаются типы `note`, `info`, `tip`, `warning` и `danger`. У каждого типа свой цвет; при стандартных настройках это соответственно нейтральный, синий, зелёный, оранжевый и красный блок.
401
+
402
+ ````md
403
+ :::note
404
+ Обычное примечание. Внутри работает Markdown: **жирный текст**, *курсив* и [ссылки](https://example.com).
405
+ :::
406
+
407
+ :::info
408
+ В процессе измерения допускается отклонение температуры не более чем на 2 °C от заданного значения.
409
+ :::
410
+
411
+ :::tip
412
+ Для повышения точности измерений выполняйте калибровку прибора перед каждой серией экспериментов.
413
+ :::
414
+
415
+ :::warning
416
+ Перед запуском алгоритма убедитесь, что входные данные приведены к единому масштабу.
417
+ :::
418
+
419
+ :::danger
420
+ Удаление исходных данных до завершения обработки делает результаты эксперимента невосстановимыми.
421
+ :::
422
+ ````
423
+
424
+ ![Примеры оформления информационных блоков разных типов](imgs/admonition.png)
425
+
426
+ Заголовок блока можно заменить своим текстом, указав его в квадратных скобках, можно указать пустой заголовок. Некоторые форматтеры Markdown требуют пустые строки внутри блока, поэтому для них используйте такой вариант. Форматтер, идущий вместе с расширением, понимает Admonition и без пустых строк.
427
+
428
+ ````md
429
+ :::tip[Рекомендация по *измерениям*]
430
+
431
+ Перед каждой серией измерений выполняйте калибровку прибора.
432
+
433
+ :::
434
+ :::note[]
435
+ Без заголовка
436
+ :::
437
+ :::note[ ]
438
+ Без заголовка, но с иконкой
439
+ :::
440
+ ````
441
+
442
+ ![Примеры отрендеренных информационных блоков с различными заголовками и иконками](imgs/admonition2.png)
443
+
444
+ #### Настройка оформления
445
+
446
+ Оформление меняется правилами `!!rule`. Вместо `<type>` укажите один из типов блока или `all`, чтобы применить правило ко всем Admonition; правило для конкретного типа, указанное позднее, имеет приоритет.
447
+
448
+ Правило `title` используется, только когда заголовок не указан в квадратных скобках у самого блока, можно указать пустое значение чтобы убрать заголовок (укажите `&nbsp;` чтобы сохранить иконку с пустым заголовком).
449
+
450
+ | Что настраивается | Правило | Пример |
451
+ |---------------------------------------------------------|------------------------------------------------------------|------------------------------------------------|
452
+ | Внешний отступ до/после блока, пт | `!!rule admonition <type> spacing <before\|after> <int>` | `!!rule admonition all spacing before 8` |
453
+ | Отступ блока слева, см | `!!rule admonition <type> indent <float>` | `!!rule admonition all indent 1.25` |
454
+ | Внутренние отступы блока по горизонтали и вертикали, пт | `!!rule admonition <type> padding <horizontal> <vertical>` | `!!rule admonition all padding 10 6` |
455
+ | Цвет фона | `!!rule admonition <type> background <#RRGGBB>` | `!!rule admonition warning background #FFF6E8` |
456
+ | Акцентный цвет: полоска, заголовок и иконка | `!!rule admonition <type> color <#RRGGBB>` | `!!rule admonition warning color #B26A00` |
457
+ | Ширина цветной полоски слева, пт | `!!rule admonition <type> bar_width <float>` | `!!rule admonition all bar_width 2.25` |
458
+ | Показывать иконку возле заголовка | `!!rule admonition <type> icon <on\|off>` | `!!rule admonition note icon off` |
459
+ | Размер иконки, пт | `!!rule admonition <type> icon size <int>` | `!!rule admonition all icon size 16` |
460
+ | Окрашивать заголовок акцентным цветом | `!!rule admonition <type> title_color <on\|off>` | `!!rule admonition all title_color off` |
461
+ | Заголовок по умолчанию | `!!rule admonition <type> title <текст>` | `!!rule admonition warning title **Важно**` |
462
+
463
+ Например, следующий набор правил создаёт блоки в строгом стиле, а для критического сообщения задаёт более заметный цвет:
464
+
465
+ ```
466
+ !!rule admonition all padding 6 4
467
+ !!rule admonition all icon off
468
+ !!rule admonition all title_color off
469
+ !!rule admonition all background #ffffff
470
+ !!rule admonition danger background #FFF4F4
471
+ !!rule admonition danger icon on
472
+ ```
473
+
474
+ ![Примеры блоков с измененными правилами оформления](imgs/admonition3.png)
475
+
366
476
  ### Разрыв страницы
367
477
  ```
368
478
  ---
@@ -372,7 +482,7 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
372
482
 
373
483
 
374
484
  ### Правила
375
- Правила - специальные команды для изменения работы системы. Их можно писать в любом месте документа - они влияют на весь документ вне зависимости от расположения. Если одно и тоже правило указано несколько раз, используется последнее значение.
485
+ Правила – специальные команды для изменения работы системы. Их можно писать в любом месте документа – они влияют на весь документ вне зависимости от расположения. Если одно и тоже правило указано несколько раз, используется последнее значение.
376
486
 
377
487
  ```
378
488
  !!rule имя правила
@@ -426,8 +536,46 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
426
536
  Альбомная ориентация с нумерацией с 3-й страницы
427
537
  ```
428
538
 
539
+ ### Колонтитулы
540
+
541
+ Колонтитулы позволяют выводить повторяющуюся информацию сверху и снизу страниц: например, инвентарный номер документа и таблицу для регистрации изменений. Синтаксис поддерживает текст и одну таблицу внутри каждого блока.
542
+
543
+ ```md
544
+ !!header align=center
545
+ Инвентарный номер:<br>567.0004653-03 98 01-07
546
+ !!endheader
547
+
548
+ !!footer
549
+ | № изменения: _________ | Подпись отв. лица: __________ | Стр. [!page] из [!pages] |
550
+ |:--|:--|--:|
551
+ !!endfooter
552
+ ```
553
+
554
+ **Синтаксис:**
555
+
556
+ ```text
557
+ !!header [align=left|center|right]
558
+ содержимое
559
+ !!endheader
560
+
561
+ !!footer [align=left|center|right]
562
+ содержимое
563
+ !!endfooter
564
+
565
+ !!header none
566
+ !!footer none|auto
567
+ ```
568
+
569
+ - `align` задаёт выравнивание текстового содержимого; по умолчанию – `left`.
570
+ - В блоке допустимы обычный текст, inline-форматирование и одна Markdown-таблица. Таблица занимает всю рабочую ширину страницы и выводится с границами.
571
+ - `[!page]` – номер текущей страницы; `[!pages]` – общее число страниц документа.
572
+ - `!!header` и `!!footer` настраивают текущий раздел и не создают разрыв раздела. За создание раздела отвечает только `!!section`.
573
+ - Настройка действует для текущего и следующих разделов до следующего одноимённого оператора или конца документа. Новый `!!header` не изменяет footer и наоборот.
574
+ - `!!header none` и `!!footer none` отключают соответствующий колонтитул. `!!footer auto` возвращает стандартный автоматический нижний колонтитул с номером страницы.
575
+ - Чтобы первая страница имела иной колонтитул, перед ней следует создать отдельный раздел с помощью `!!section`.
576
+
429
577
  ### Автонумерация
430
- Система автонумерации автоматически нумерует элементы документа (разделы, рисунки, таблицы, листинги, источники) и позволяет ссылаться на них из текста.
578
+ Система автонумерации автоматически нумерует элементы документа (разделы, рисунки, таблицы, листинги, формулы, источники) и позволяет ссылаться на них из текста.
431
579
 
432
580
  Номера элементов и ссылки задаются выражениями в квадратных скобках: `[...]`.
433
581
 
@@ -435,7 +583,7 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
435
583
 
436
584
  #### Базовый функционал:
437
585
 
438
- В тексте `[#]` указывает на следующий элемент нумерации - рисунок, таблица, листинг - первое, что из этого встретилось.
586
+ В тексте `[#]` указывает на следующий элемент нумерации – рисунок, таблица, листинг, формула – первое, что из этого встретилось.
439
587
 
440
588
  В подписи элемента `[#]` заменяется на номер и подпись (например: `Рисунок 1 - `).
441
589
 
@@ -466,6 +614,14 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
466
614
  Заголовок 1 | Заголовок 2
467
615
  ------------|------------
468
616
  текст | текст
617
+
618
+ ## [#] Пример с формулой
619
+ В формуле [#] показана связь энергии и массы.
620
+
621
+ [#]
622
+ $$
623
+ E = mc^2
624
+ $$
469
625
  ````
470
626
 
471
627
  **Результат:**
@@ -492,6 +648,11 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
492
648
  Заголовок 1 | Заголовок 2
493
649
  ------------|------------
494
650
  текст | текст
651
+
652
+ ## 1.4 Пример с формулой
653
+ В формуле 1 показана связь энергии и массы.
654
+
655
+ E = mc^2 \qquad (1)
495
656
  ````
496
657
 
497
658
  *У картинки перед круглой скобкой пробела быть не должно (тут он стоит из-за некоторых проблем с отображением этого файла)*
@@ -573,6 +734,12 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
573
734
  ![[cat] Кот] (cat1.png)
574
735
  ![[img2] Котик] (cat2.png)
575
736
  ![[Котяра] Котяра] (cat3.png)
737
+
738
+ [energy]
739
+ $$
740
+ E = mc^2
741
+ $$
742
+ Как показано в формуле [energy], энергия кота зависит от массы.
576
743
  ```
577
744
 
578
745
  К именованной ссылке также можно применять смещение: `[name ± N]`.
@@ -592,14 +759,16 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
592
759
  Документ содержит [!pages] страниц,
593
760
  [!imgs] рисунков,
594
761
  [!tables] таблиц,
595
- [!codes] листингов.
762
+ [!codes] листингов,
763
+ [!formulas] формул,
764
+ [!sources] источников.
596
765
  ```
597
766
 
598
767
  **Примечание:** `[!pages]` может отображаться некоректно до рендера в pdf (как пустота или неверное значение). В таком случае выделите это место в Word и нажмите ПКМ->"Обновить поле" (при рендере в pdf не требуется).
599
768
 
600
769
  #### Настройки автонумерации
601
770
  * Включить ленивую автонумерацию: `!!rule numbering lazy`
602
- * Когда включено, более не нужно писать `[#]` в названиях картинок, таблиц и т.д. - добавляется автоматически
771
+ * Когда включено, более не нужно писать `[#]` в названиях картинок, таблиц и т.д. – добавляется автоматически
603
772
  * Включить нумерацию по разделам: `!!rule numbering sections`
604
773
  * `Рисунок 1 - Кот` -> `Рисунок 1.1 - Кот`
605
774
  * Отключить автоматическое добавление названия элемента: `!!rule numbering autoprefix off`
@@ -628,24 +797,36 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
628
797
  ```html Шаблон html страницы
629
798
  <html></html>
630
799
  ```
800
+
801
+ В формуле [#] показана связь энергии и массы.
802
+
803
+ $$
804
+ E = mc^2
805
+ $$
631
806
  ````
632
807
 
633
808
 
634
809
  ### Вставка внешнего документа
635
810
 
636
- Команда позволяет вставить содержимое файлов DOCX (с поддержкой шаблонизации) или PDF. Путь к документу вычисляется относителено `.g.md` файла
811
+ Команда позволяет вставить содержимое файлов DOCX, PDF, `.md` и `.g.md`.
637
812
 
638
813
  Синтаксис: `!!(путь/к/файлу){"ключ": "значение"}`
639
814
 
640
815
 
641
- **Особенности вставки:**
642
- * **DOCX:** Поддерживает передачу параметров. Внутри файла поля должны быть оформлены в двойных фигурных скобках: `{{поле}}`.
816
+ Тип вставки определяется расширением файла:
817
+ * **DOCX:** Поддерживает передачу параметров. Поля внутри документа оформляются в двойных фигурных скобках: `{{поле}}`.
643
818
 
644
819
  ![screenshot](https://raw.githubusercontent.com/MixelTe/md2gost/master/imgs/screenshot_doc_include.png)
645
820
 
646
- * **PDF:** Вставляется «как есть», блок параметров должен быть пустым `{}`.
821
+ * **PDF:** Вставляется «как есть». Блок параметров должен быть пустым `{}`.
822
+
823
+ * **Markdown (`.md`, `.g.md`):** содержимое файла раскрывается непосредственно в тело документа до рендера. Поэтому внутри подключаемого файла можно использовать обычный синтаксис md2gost, включая правила, секции и другие вставки.
647
824
 
648
- > **Ограничение:** Вставка внешнего файла поддерживается только при экспорте в PDF.
825
+ Подробнее о передаче переменных, вложенных Markdown-вставках и шаблонизации см. в разделе [Markdown-вставки и шаблонизация](#markdown-вставки-и-шаблонизация).
826
+
827
+ Путь к подключаемому файлу вычисляется относительно файла, содержащего директиву вставки.
828
+
829
+ > **Ограничение DOCX/PDF:** такие вставки добавляются только при экспорте в PDF. Markdown-вставки работают при экспорте и в DOCX, и в PDF.
649
830
 
650
831
 
651
832
  #### Примеры использования
@@ -670,6 +851,8 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
670
851
  !!section from 2
671
852
  ```
672
853
 
854
+ В подключаемом DOCX эти значения можно использовать как `{{taskN}}`, `{{topic}}`, `{{group}}` и `{{name}}`.
855
+
673
856
  Подробнее про `!!section` в главе [Разрыв раздела](#разрыв-раздела).
674
857
 
675
858
  **3. Вставка в произвольное место документа**
@@ -723,17 +906,21 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
723
906
  - `&Tab;` на отступ (таб)
724
907
  - `&Star;` на `*`
725
908
  - `&#124;` на `|`
909
+ - `&amp;` на `&`
726
910
  - `&shy;` на Soft Hyphen (мягкий перенос)
727
911
  - `&#x200B;` на ничего (используйте чтобы обмануть парсер)
728
912
  - `&alpha; &beta; &gamma; &delta; &epsilon; &zeta; &eta; &theta; &iota; &kappa; &lambda; &mu; &nu; &xi; &omicron; &pi; &rho; &sigma; &tau; &upsilon; &phi; &chi; &psi; &omega; &Delta; &Sigma; &Omega;` на `α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω Δ Σ Ω`
729
913
  - `&infin; &sum; &prod; &radic; &int; &part; &asymp; &ne; &lt; &gt; &le; &ge; &plusmn; &times; &divide;` на `∞ ∑ ∏ √ ∫ ∂ ≈ ≠ < > ≤ ≥ ± × ÷`
730
914
  - `&copy; &reg; &trade; &sect; &para; &hellip; &bull; &middot; &deg; &euro; &pound; &yen; &cent; &curren; &fnof; &permil;` на `© ® ™ § ¶ … • · ° € £ ¥ ¢ ¤ ƒ ‰`
915
+ - `[!page]` на номер текущей страницы
731
916
  - `[!pages]` на кол-во страниц
732
917
  - `[!imgs]` на кол-во картинок
733
918
  - `[!tables]` на кол-во таблиц
734
919
  - `[!codes]` на кол-во листингов
735
920
  - `[!sources]` на кол-во источников
736
921
 
922
+ При экспорте обычные пробелы автоматически заменяются на неразрывные там, где части записи должны оставаться вместе: после коротких служебных слов (`в таблице`), между обозначением и номером (`рисунок 1`, `№ 5`, `ГОСТ 123`), в инициалах (`А. С. Пушкин`), адресах (`ул. Ленина`), датах (`2026 г.`), а также между числом и единицей измерения (`15 кг`, `25 %`). Дефисы внутри слов и обозначений (`веб-сервис`, `UTF-8`) также становятся неразрывными. Исходный Markdown при этом не меняется.
923
+
737
924
  ### Настройка стилей
738
925
  Строгость ГОСТа не уступает его разнообразию. В этом разделе представлены правила для настройки стилей.
739
926
 
@@ -759,6 +946,9 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
759
946
  - `!!rule text spacing after <int>`
760
947
  - Пример: `!!rule text spacing after 0`
761
948
  - По умолчанию: `8` пт
949
+ * Автоматическая расстановка переносов
950
+ - `!!rule hyphenation`
951
+ - По умолчанию: выключено
762
952
  * Заголовки
763
953
  * Размер заголовка
764
954
  - `!!rule headings h<1-6>[+] size <int>`
@@ -792,9 +982,6 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
792
982
  !!rule headings h2 size 16
793
983
  !!rule headings h2+ spacing before 15
794
984
  ```
795
- * Автоматическая расстановка переносов
796
- - `!!rule hyphenation`
797
- - По умолчанию: выключено
798
985
  * Таблицы
799
986
  * Начертание названия
800
987
  - `!!rule table title style <normal|bold|italic>`
@@ -880,7 +1067,15 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
880
1067
  - `!!rule list autopunctuation <on|off>`
881
1068
  - Пример: `!!rule list autopunctuation off`
882
1069
  - По умолчанию: `on`
883
-
1070
+ * Формулы
1071
+ * Интервал перед формулой
1072
+ - `!!rule formula spacing before <int>`
1073
+ - Пример: `!!rule formula spacing before 6`
1074
+ - По умолчанию: `0` пт
1075
+ * Интервал после формулы
1076
+ - `!!rule formula spacing after <int>`
1077
+ - Пример: `!!rule formula spacing after 6`
1078
+ - По умолчанию: наследуется от текста
884
1079
 
885
1080
  #### Примеры
886
1081
 
@@ -950,3 +1145,207 @@ Without Microsoft Word, PDF export and several advanced Word-specific features a
950
1145
  - По умолчанию: время рендера
951
1146
  * `!!rule rainbow`
952
1147
 
1148
+ ### Markdown-вставки и шаблонизация
1149
+
1150
+ Markdown-файлы с расширением `.md` и `.g.md` обрабатываются иначе, чем DOCX и PDF: их содержимое раскрывается в исходный документ **до рендера** и становится его полноценной частью.
1151
+
1152
+ Это позволяет разбивать большие документы на отдельные файлы и использовать повторно отдельные главы, таблицы, блоки и другие фрагменты.
1153
+
1154
+ Например:
1155
+
1156
+ ```markdown
1157
+ # Отчёт
1158
+
1159
+ !!(blocks/introduction.md){}
1160
+
1161
+ !!(blocks/results.md){}
1162
+ ```
1163
+
1164
+ В подключаемых файлах разрешён весь синтаксис md2gost, включая:
1165
+
1166
+ * правила форматирования;
1167
+ * секции;
1168
+ * изображения и ссылки;
1169
+ * другие Markdown-вставки.
1170
+
1171
+ Относительные пути внутри подключаемого Markdown-файла вычисляются относительно самого подключаемого файла. Пути к изображениям и ссылкам при раскрытии вставки корректируются автоматически.
1172
+
1173
+
1174
+ #### Передача переменных
1175
+
1176
+ В Markdown-вставку можно передавать переменные через блок параметров:
1177
+
1178
+ ```markdown
1179
+ !!(blocks/student.md){
1180
+ "name": "Иванов И.И.",
1181
+ "group": "КЛМН-01"
1182
+ }
1183
+ ```
1184
+
1185
+ В `blocks/student.md` они доступны через двойные фигурные скобки:
1186
+
1187
+ ```markdown
1188
+ # {{name}}
1189
+
1190
+ Группа: {{group}}
1191
+ ```
1192
+
1193
+ Можно обращаться и к вложенным значениям:
1194
+
1195
+ ```markdown
1196
+ # {{student.name}}
1197
+
1198
+ Группа: {{student.group}}
1199
+ Первый результат: {{student.scores[0]}}
1200
+ ```
1201
+
1202
+ Например:
1203
+
1204
+ ```markdown
1205
+ !!(blocks/student.md){
1206
+ "student": {
1207
+ "name": "Иванов И.И.",
1208
+ "group": "КЛМН-01",
1209
+ "scores": [5, 4, 5]
1210
+ }
1211
+ }
1212
+ ```
1213
+
1214
+
1215
+ #### Значения по умолчанию
1216
+
1217
+ Для переменных можно указывать запасное значение:
1218
+
1219
+ ```markdown
1220
+ {{name || "Без имени"}}
1221
+ {{comment ?? "Комментарий отсутствует"}}
1222
+ ```
1223
+
1224
+ Поддерживаются два оператора:
1225
+
1226
+ * `value || fallback` — использует запасное значение, если исходное значение отсутствует, равно `null`, `false`, `0` или пустой строке.
1227
+ * `value ?? fallback` — использует запасное значение только если исходное значение отсутствует или равно `null`.
1228
+
1229
+ Для экранирования кавычки используется обратный слеш:
1230
+
1231
+ ```markdown
1232
+ {{name || "это \"инкогнито\" с обратным \\ слешом"}}
1233
+ ```
1234
+
1235
+
1236
+ #### Передача объектов и массивов
1237
+
1238
+ По умолчанию значение, подставляемое внутрь текста, преобразуется в строку.
1239
+
1240
+ Если объект или массив нужно передать дальше во вложенную Markdown-вставку без такого преобразования, значение должно состоять только из одной переменной:
1241
+
1242
+ ```markdown
1243
+ !!(table.md){
1244
+ "rows": "{{student.rows}}"
1245
+ }
1246
+ ```
1247
+
1248
+ В этом случае `rows` получит исходное значение `student.rows`, например массив или объект, а не его строковое представление.
1249
+
1250
+
1251
+ #### Наследование переменных
1252
+
1253
+ Вложенная Markdown-вставка наследует переменные родительского документа.
1254
+
1255
+ Например, если в основном документе доступна переменная `author`, она будет доступна и внутри подключаемого Markdown-файла без явной повторной передачи.
1256
+
1257
+ При необходимости значение можно переопределить:
1258
+
1259
+ ```
1260
+ !!(chapter.md){
1261
+ "author": "Петров П.П."
1262
+ }
1263
+ ```
1264
+
1265
+ Внутри `chapter.md` будет использовано новое значение `author`, а остальные переменные продолжат наследоваться от родителя.
1266
+
1267
+
1268
+ #### Неизвестные переменные и экранирование
1269
+
1270
+ Если указанная переменная не существует, md2gost выводит предупреждение, а маркер остаётся в тексте без изменений:
1271
+
1272
+ ```
1273
+ {{unknownVariable}}
1274
+ ```
1275
+
1276
+ Чтобы вывести конструкцию `{{...}}` буквально и не выполнять подстановку, перед ней нужно поставить обратный слеш:
1277
+
1278
+ ```
1279
+ \{{name}}
1280
+ ```
1281
+
1282
+ Поддерживаются также HTML-комментарии:
1283
+
1284
+ ```
1285
+ <!-- Этот текст не попадёт в результат -->
1286
+ ```
1287
+
1288
+ Если последовательность `<!--` нужно вывести буквально, не создавая HTML-комментарий, её можно записать через шаблонную вставку:
1289
+
1290
+ ```
1291
+ {{"<!--"}}
1292
+ ```
1293
+
1294
+
1295
+ #### Переменные главного документа
1296
+
1297
+ При использовании npm-пакета переменные можно передать не только во вставку, но и непосредственно в главный документ через `MDRenderConfig.variables`:
1298
+
1299
+ ```ts
1300
+ await renderMarkdown({
1301
+ input: "./report.g.md",
1302
+ variables: {
1303
+ author: "Иванов И.И.",
1304
+ settings: { compact: true }
1305
+ }
1306
+ });
1307
+ ```
1308
+
1309
+ После этого переменные доступны в основном документе и наследуются подключаемыми Markdown-файлами.
1310
+
1311
+
1312
+ #### Расширенная шаблонизация
1313
+
1314
+ В подключаемых Markdown-файлах можно использовать условные блоки и циклы. В основном документе шаблонные выражения выполняются, если переменные переданы через `MDRenderConfig.variables` в программном API.
1315
+
1316
+ ```markdown
1317
+ {{#if showResults}}
1318
+ ## Результаты
1319
+ {{#for result, index in results}}
1320
+ {{index + 1}}. {{result}}
1321
+ {{:else}}
1322
+ Результатов пока нет.
1323
+ {{/for}}
1324
+ {{:else}}
1325
+ Раздел скрыт.
1326
+ {{/if}}
1327
+ ```
1328
+
1329
+ Условие `{{#if ...}}` проверяет значение переменной или сравнение, например `{{#if score >= 5}}`. Цикл `{{#for value in items}}` перебирает массив; запись `{{#for value, key in items}}` дополнительно даёт индекс или ключ. Циклы также принимают объект, строку или целое число (повторение заданное число раз). Блок `{{:else}}` необязателен и работает как с условием, так и с пустым циклом. Блоки можно вкладывать друг в друга.
1330
+
1331
+ В подстановках доступны значения переменных, строки, числа, `true`, `false`, `null` и одно бинарное действие. Поддерживаются арифметические операторы `+`, `-`, `*`, `/`, `//` (целочисленное деление), `%`, `**`; в условиях — сравнения `==`, `!=`, `<`, `<=`, `>`, `>=`, `in` и логические `and`, `or`, `&&`, `||`, `??`. Для подстановки по-прежнему работают `||` и `??` со значением по умолчанию.
1332
+
1333
+ Чтобы убрать пробельные символы вокруг выражения, добавьте `-` после открывающих или перед закрывающими скобками: `{{- name -}}`. Для Markdown-вставки на отдельной строке форма `!!(-chapter.md-){}` убирает пробелы вокруг директивы. Запись `!!(--chapter.md--){}` убирает пробелы не только вокруг директивы, но и крайние внутри вставляемого документа. (Можно убирать пробелы только с одной стороны: `{{- name }}`, `!!(chapter.md-){}`)
1334
+
1335
+ Для сложных или полученных извне шаблонов можно ограничить объём обработки через `MDRenderConfig.templateOptions`:
1336
+
1337
+ ```ts
1338
+ await renderMarkdown({
1339
+ input: "./report.g.md",
1340
+ variables: { showResults: true, results: ["Первый", "Второй"] },
1341
+ templateOptions: {
1342
+ allowLoops: true,
1343
+ allowIncludes: true,
1344
+ maxTotalIterations: 2000,
1345
+ maxIncludeDepth: 100
1346
+ }
1347
+ });
1348
+ ```
1349
+
1350
+ Также доступны ограничения `maxLoopIterations`, `maxDepth`, `maxIncludes`, `maxFileLength`, `maxTotalInputLength` и `maxGeneratedLength`. В расширении VS Code суммарное число итераций и глубина Markdown-вставок задаются настройками `md2gost.render.maxTotalIterations` и `md2gost.render.maxIncludeDepth`.
1351
+