Шаблонизатор VMX::Template/Идеи — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
(Новая страница: «Идеи: * Чуть более хитрую обработку пробелов ([%+ и [%- как в TT, режим для обрезания пробелов …»)
 
м
 
Строка 1: Строка 1:
Идеи:
+
* HTML-режим, в котором по умолчанию экранируется всё, а чтобы не экранировать или экранировать иначе, нужно специально навесить сверху нужное преобразование, что-то типа <tt>{raw(value)}</tt> или <tt>{js(value)}</tt>. Хотя возможны проблемы с, скажем, JS внутри значения параметров типа onclick.
 +
* НЕвключение результата выражения, кроме INCLUDE, внутри <nowiki><!-- директивы --></nowiki>
 
* Чуть более хитрую обработку пробелов ([%+ и [%- как в TT, режим для обрезания пробелов в начале строки).
 
* Чуть более хитрую обработку пробелов ([%+ и [%- как в TT, режим для обрезания пробелов в начале строки).
 +
* Возможно, возродить авто-переводы?
 
* Если в коде шаблона очень много инструкций — предупреждение «а не пора бы вам это перенести в код».
 
* Если в коде шаблона очень много инструкций — предупреждение «а не пора бы вам это перенести в код».
 
* Наследование шаблонов (только сначала определиться, что это вообще такое)
 
* Наследование шаблонов (только сначала определиться, что это вообще такое)
* HTML-режим, в котором по умолчанию экранируется всё, а чтобы не экранировать или экранировать иначе, нужно специально навесить сверху нужное преобразование, что-то типа <tt>{raw(value)}</tt> или <tt>{js(value)}</tt>. Хотя возможны проблемы с, скажем, JS внутри значения параметров типа onclick.
 
  
 
Ни в коем случае:
 
Ни в коем случае:
Строка 37: Строка 38:
 
*: Это возможно, так как шаблонизатор в курсе (большинства) зависимостей частей представления от конкретных элементов данных
 
*: Это возможно, так как шаблонизатор в курсе (большинства) зависимостей частей представления от конкретных элементов данных
 
* Уметь «переключать» представление на новый объект, также меняя только его части
 
* Уметь «переключать» представление на новый объект, также меняя только его части
 
=== Замечание по включениям ===
 
 
Также имеют особенность: результат этих функций подставляется даже при использовании в директивах. То есть, например, если маркеры директив <tt><nowiki><!-- --></nowiki></tt>, а подстановок <tt><nowiki>{ }</nowiki></tt>, то <tt><nowiki><!-- include(...) --></nowiki></tt> всё равно будет подставлено. Игнорировать результат нужно явно: <tt><nowiki><!-- void include(...) --></nowiki></tt>.
 

Текущая версия на 22:04, 20 апреля 2013

  • HTML-режим, в котором по умолчанию экранируется всё, а чтобы не экранировать или экранировать иначе, нужно специально навесить сверху нужное преобразование, что-то типа {raw(value)} или {js(value)}. Хотя возможны проблемы с, скажем, JS внутри значения параметров типа onclick.
  • НЕвключение результата выражения, кроме INCLUDE, внутри <!-- директивы -->
  • Чуть более хитрую обработку пробелов ([%+ и [%- как в TT, режим для обрезания пробелов в начале строки).
  • Возможно, возродить авто-переводы?
  • Если в коде шаблона очень много инструкций — предупреждение «а не пора бы вам это перенести в код».
  • Наследование шаблонов (только сначала определиться, что это вообще такое)

Ни в коем случае:

  • Не добавлять фильтры :) это те же функции, только зачем-то в другом синтаксисе, некомбинируемом с другими вещами, и менее удобном.
  • Не делать идентичным синтаксис вызова метода объекта и получения элемента хеша (как в TT и ещё много где).

Пока непонятно, нужно ли и в каком виде:

  1. Поддержка проверки формата входных данных?
  2. «Классо-образный» синтаксис вызова функций из шаблонов?

НЕ НУЖНО: декларативные шаблоны

Концептуальная идея: «декларативные» шаблоны и «функциональная» их обработка, в противовес «процедурной».

То есть, сначала разбиение шаблона на части (статические и вычисляемые), потом в негарантированном порядке замена вычисляемых элементов. За этим стоит идея — если мы будем так обрабатывать запросы в код, это даст возможность коду узнавать, какие же реально шаблону нужны данные, и вытаскивать из базы ровно их.

То есть, как бы шаблоны, которые можно выполнять с любого места в любой момент. То есть либо убрать инструкцию SET, либо превратить её в по сути DEFINE :)

И сразу концепция, которая бы дала возможность коду «узнавать»: «генераторы». Генератор — это некая функция, которая может дать много ответов сразу, причём быстрее, чем если каждый из них давать по одному. Но конкретный набор нужных данных неизвестен, генерировать и выводить в шаблон всё сразу не хочется, а хочется заюзать ленивость по полной. Шаблонизатор мог бы пройтись по всему коду шаблона, собрать встреченные вызовы генераторов, смело сгруппировать их и обработать пачками.

Но до этого вряд ли дело дойдёт.

Концепт номер два: HTML-компоненты

Мысль: классический подход к шаблонизации не совсем удобен для всё чаще и чаще необходимых динамических интерфейсов, которые с одной стороны должны выводиться через HTML, а с другой — уметь меняться через JS. При обычном подходе логику зачастую приходится дублировать, а иногда и вставлять довольно некрасивые подпорки.

Соответственно, идея: возможность компиляции частей шаблона («компонентов») как в HTML, так и в JS, генерирующий HTML. Круче всего, если бы оно умело само:

  • Создавать экземпляр JS-объекта, инкапсулирующего данный «компонент»
  • Автоматически цеплять этот объект к уже выведенному HTML-коду
  • Автоматически привязывать события к конкретным элементам внутри «компонента»
  • Обновлять DOM дерево не целиком (innerHTML), а по частям, конкретные элементы
  • Автоматически обновлять представление компонента при изменении полей JS-объекта
    Это возможно, так как шаблонизатор в курсе (большинства) зависимостей частей представления от конкретных элементов данных
  • Уметь «переключать» представление на новый объект, также меняя только его части