Блоки и шаблоны
Что такое блок
Блок — единица конструктора. Каждый блок = фрагмент Pug-кода, который при сборке конкатенируется с другими блоками в итоговый PUG-файл.
Блоки хранятся в Block.pug (файл z51-pug-builder/public/Block.pug), разделены комментариями //Название блока.
Как парсятся блоки
Файл parsing.js → функция parseBlocks(text):
- Разбивает текст по строкам, начинающимся с
// - Каждый
//— начало нового блока, текст после//— имя - Содержимое до следующего
//— контент блока - Блоки с именем "Доп. текст" фильтруются
Результат: [{name: "Заголовок", content: "+spacerLine(40)\ntr\n td..."}, ...]
Типы полей
При добавлении блока в конструктор, система строит схему полей (buildBaseSchema):
| Тип поля | Описание | Пример в Pug |
|---|---|---|
raw |
Весь контент блока как есть | Блоки "3 товара в ряд" |
text |
Текстовое содержимое после тега | span.font.h2 ТЕКСТ |
mixin-text |
Текстовый аргумент миксина | +buttonRounded("Текст", ...) |
mixin-href |
URL-аргумент миксина | +buttonRounded("...", "https://...") |
mixin-ids |
Список ID (через запятую) | +products4("123,456,789") |
mixin-opts |
Объект опций в миксине | +products4("...", {hidePrice: true}) |
href |
Атрибут href | a(href="https://...") |
src |
Атрибут src | img(src="https://...") |
list-item |
Элемент списка (tr+td+span) | Блоки с таблицами товаров |
Автоопределение полей
Функция guessAutoMixinField(rawArg, argIndex) определяет тип аргумента миксина:
- Содержит запятые и цифры →
mixin-ids - Начинается с
{→ объект, парситсяparseMixinObjectArg - Начинается с
http//→mixin-href - Иначе →
mixin-text
Для объектных аргументов ({key: value}) каждый ключ проверяется через shouldExposeObjectField:
- Пропускаются служебные:
class,style,id,data-* - Тип определяется по имени ключа (
guessObjectFieldByKey):url/href/link→ href,src/image/img→ src, иначе → text
Секции блока
Сложные блоки (карточки товаров) состоят из секций — повторяющихся групп строк внутри tr:
tr ← колонка
td.paddingWrapper
+defaultTable("100%")
tr ← секция "Картинка"
td
img(src="...")
+spacerLine(10)
tr ← секция "Текст"
td
span.font ТЕКСТ
Функция parseSections(content) находит такие структуры и позволяет:
- Перемещать секции вверх/вниз внутри блока (
moveSectionInBlock) - Удалять секции с автоудалением спейсеров (
removeSectionFromBlock)
Типы секций определяются по содержимому (guessSectionLabel): Кнопка, Картинка, Товары, Заголовок, Текст, Ссылка.
Product Options
Для блоков с товарами (миксины +products*) есть опции — ключи в объектном аргументе:
+products4("123,456,789", {hidePrice: true, showOldPrice: false})
Опции настраиваются в settings.json → productOptions[]:
[
{"key": "hidePrice", "label": "Скрыть цену", "default": false},
{"key": "showOldPrice", "label": "Показать старую цену", "default": true}
]
Кнопки в UI: включить/выключить опцию для одного блока или всех блоков.
Mixin Rules
Правила разметки аргументов миксинов (когда автоопределение не справляется):
{
"mixin": "+products4",
"args": [
{"index": 0, "type": "mixin-ids", "label": "ID товаров"},
{"index": 1, "type": "mixin-opts", "label": "Опции"}
]
}
Кастомные блоки
Пользователь может:
- Дублировать существующий блок как кастомный (
duplicateBlockAsCustom) - Создать новый в настройках (
addCustomBlock) - Переименовать блок (
renameBlock)
Кастомные блоки хранятся в settings.customBlocks[] и мержатся с блоками из Block.pug.
Quick Blocks
Быстрые блоки — панель кнопок над списком блоков для быстрого добавления:
- Настраиваются в settings →
quickBlocks[] - Поддерживают drag-and-drop для перестановки
- 3 цвета: White (default), Blue, Green →
quickBlockColors
Шаблоны блоков
Каждый блок может иметь переопределённый шаблон в settings:
{
"blocks": {
"БАННЕР": {
"template": "+spacerLine(40)\ntr\n td\n a(href=\"\")\n img(src=\"\")",
"defaultSpacing": 0
}
}
}
getEffectiveTemplate(name) — возвращает override из settings или оригинал из Block.pug.
Спейсеры между блоками
globalSpacing— отступ по умолчанию (обычно 40)- Каждый блок может переопределить:
block.spacing(ввод в UI) илиsettings.blocks[name].defaultSpacing block.addSpacing— флаг, добавлять ли спейсер перед блоком- При сборке:
+spacerLine(spacing)вставляется между блоками
Drag-and-Drop блоков
Блоки в конструкторе перетаскиваются мышью:
handleBlockDragStart(index)→handleBlockDragOver(index)→handleBlockDrop(index)- Визуальная индикация:
dragging-block,drag-over-block - Обновляет массив
assembledBlocks[]
Import/Export
exportBlocksPug()— экспорт всех шаблонов блоков в текстimportBlocksPug()— импорт из текста (парсит и обновляет block.pug)downloadBlocksPug()— скачивание как файл