JS: Прототипы
Теория: Проект HTML Builder
В этом уроке начинаем проект курса: HTML Builder. Идея простая: мы описываем HTML в виде структуры данных (DSL), а библиотека превращает эту структуру в готовую HTML-строку.

На словах это звучит легко. На практике здесь как раз начинается инженерная работа: нужно придумать такое представление данных, чтобы его было удобно и писать руками, и обрабатывать в коде.
Порядок работы
В уроке идем в таком порядке:
- придумываем DSL
- фиксируем ожидаемое поведение тестом
- пишем реализацию
Это подход через TDD: сначала формулируем контракт, потом строим код под этот контракт.
Тест задает API
На этом этапе API библиотеки минимальный: одна функция принимает DSL и возвращает HTML.
Один такой тест уже задает направление всей реализации: какой вход ожидается и какой результат считается правильным.
Как смотреть на HTML в задаче
Если HTML воспринимать только как строку, его неудобно анализировать и менять программно. Если воспринимать как дерево, картина становится проще.
У каждого узла есть:
- имя тега
- атрибуты
- тело (текст)
- дочерние узлы
В этом уроке фокус на парных тегах. С одиночными тегами есть отдельные нюансы, их разбираем позже.
Базовое представление узла
Обобщенная форма тега в DSL:
Здесь важный момент: children содержит такие же теги. Это рекурсивная структура, а значит она естественно ложится на дерево HTML.
Почему одной формы недостаточно
Формат [tagName, attributes, body, children] удобен для обработки. Но писать такой DSL вручную утомительно: часто у тега нет атрибутов, нет детей или нет текста.
Поэтому поддерживаем короткие формы:
Именно тут появляется практическая задача: понять по аргументу, что это - attributes, body или children.
Как различать типы аргументов
Ключевой фрагмент:
Здесь важно не ошибиться с проверками: массив тоже объект, а примитивная строка не проходит instanceof String.
Итоговая структура данных
Эта форма уже описывает вложенность, текст и атрибуты. Этого достаточно, чтобы построить рабочий HTML Builder.
Итоги
Мы проектируем не просто формат хранения, а интерфейс между человеком и программой.
DSL должен одновременно:
- быть удобным для записи
- быть предсказуемым для парсинга
Баланс между этими требованиями подводит нас к следующему шагу курса - выделению AST и более строгой внутренней модели.