Шаблонизатор VMX::Template/Идеи
- HTML-режим, в котором по умолчанию экранируется всё, а чтобы не экранировать или экранировать иначе, нужно специально навесить сверху нужное преобразование, что-то типа {raw(value)} или {js(value)}. Хотя возможны проблемы с, скажем, JS внутри значения параметров типа onclick.
- НЕвключение результата выражения, кроме INCLUDE, внутри <!-- директивы -->
- Чуть более хитрую обработку пробелов ([%+ и [%- как в TT, режим для обрезания пробелов в начале строки).
- Возможно, возродить авто-переводы?
- Если в коде шаблона очень много инструкций — предупреждение «а не пора бы вам это перенести в код».
- Наследование шаблонов (только сначала определиться, что это вообще такое)
Ни в коем случае:
- Не добавлять фильтры :) это те же функции, только зачем-то в другом синтаксисе, некомбинируемом с другими вещами, и менее удобном.
- Не делать идентичным синтаксис вызова метода объекта и получения элемента хеша (как в TT и ещё много где).
Пока непонятно, нужно ли и в каком виде:
- Поддержка проверки формата входных данных?
- «Классо-образный» синтаксис вызова функций из шаблонов?
НЕ НУЖНО: декларативные шаблоны
Концептуальная идея: «декларативные» шаблоны и «функциональная» их обработка, в противовес «процедурной».
То есть, сначала разбиение шаблона на части (статические и вычисляемые), потом в негарантированном порядке замена вычисляемых элементов. За этим стоит идея — если мы будем так обрабатывать запросы в код, это даст возможность коду узнавать, какие же реально шаблону нужны данные, и вытаскивать из базы ровно их.
То есть, как бы шаблоны, которые можно выполнять с любого места в любой момент. То есть либо убрать инструкцию SET, либо превратить её в по сути DEFINE :)
И сразу концепция, которая бы дала возможность коду «узнавать»: «генераторы». Генератор — это некая функция, которая может дать много ответов сразу, причём быстрее, чем если каждый из них давать по одному. Но конкретный набор нужных данных неизвестен, генерировать и выводить в шаблон всё сразу не хочется, а хочется заюзать ленивость по полной. Шаблонизатор мог бы пройтись по всему коду шаблона, собрать встреченные вызовы генераторов, смело сгруппировать их и обработать пачками.
Но до этого вряд ли дело дойдёт.
Концепт номер два: HTML-компоненты
Мысль: классический подход к шаблонизации не совсем удобен для всё чаще и чаще необходимых динамических интерфейсов, которые с одной стороны должны выводиться через HTML, а с другой — уметь меняться через JS. При обычном подходе логику зачастую приходится дублировать, а иногда и вставлять довольно некрасивые подпорки.
Соответственно, идея: возможность компиляции частей шаблона («компонентов») как в HTML, так и в JS, генерирующий HTML. Круче всего, если бы оно умело само:
- Создавать экземпляр JS-объекта, инкапсулирующего данный «компонент»
- Автоматически цеплять этот объект к уже выведенному HTML-коду
- Автоматически привязывать события к конкретным элементам внутри «компонента»
- Обновлять DOM дерево не целиком (innerHTML), а по частям, конкретные элементы
- Автоматически обновлять представление компонента при изменении полей JS-объекта
- Это возможно, так как шаблонизатор в курсе (большинства) зависимостей частей представления от конкретных элементов данных
- Уметь «переключать» представление на новый объект, также меняя только его части