Сейчас подумал, что можно сделать маску для имени шаблона, будет как раз компромисс.
base.ss
{template %filename%()}
...
{/}
profile.ss
{include 'base.ss'}
{template %fileName%() extends base}
...
{/}
Т.е. %fileName% будет реплейсится на имя файла. |
Фак, похоже придётся опять на наделю релиз перенести, завтра уезжаю в Мск, иду на свадьбу гулять, наверн дня на 3-4 выпаду :)
|
Цитата:
|
Цитата:
|
Сейчас продумываю такую концепцию, как вызываемые блоки:
{template foo()}
{forEach arr => el}
{block elem(el)}
...
{/}
{/}
{/}
Конструкция с block будет отрендерена как
if (!foo.elem) {
foo.elem = function (el) {
...
};
}
foo.elem(el);
Т.е. создаётся функция, которая сохраняется как свойство функции-шаблона. Это решает проблему, когда нужно создать подшаблон, который должен иметь доступ к переменным замыкания главного шаблона и быть доступен для повторного вызова "вне шаблона", т.е. из JS, но в тоже время будет являться структурной единицей Snakeskin, т.е. можно явно переопределять в дочернем шаблоне и использовать директиву super. |
Добавил поддержку генераторов.
{template *foo(data)}
<div class="bar">
{forEach data => el}
{apply row(el)}
{yield}
{/}
</div>
{/}
Директива yield будет отрендерена как yeild __RESULT__; __RESULT__ = ''; т.е. каждый "тик" (вызов next) будет возвращать кусок отрендеренного шаблона. Зачем я это добавил: у меня в проекте есть места, где данные из БД возвращаются асинхронными чанками из разных сегментов и сейчас мне приходится ждать пока появятся все данные, затем выполнить шаблон (который вернёт огромную строку, и также может надолго залочить поток, т.к. внутри большой цикл) и уже потом отправлять клиенту. С использованием генератора можно очень легко преобразовать шаблон, чтобы он также возвращал чанки по фрагментам данных, которые приходят из БД и сразу же отправлял их клиенту. В данной схеме нету опасности залочить поток и с точки зрения конечной производительности наблюдается реальный профит. Также генераторы позволят легко "дробить" тяжёлый шаблон на куски с помощью setImmediate, чтобы не лочить поток. ЗЫ: напоминаю, что пока, чтобы юзать генераторы в ноде, то нужно запускать её с флагом --harmony. |
Чего то ппц затянулся этот релиз :(
Сегодня заканчиваю активную разработку, завтра финальный review и тесты и начинаю работать над докой. ЗЫ: самое глобальное обновление за всю историю проекта, количество коммитов почти равно общему количеству коммитов всех предыдущих версий :) Собственная кодовая база увеличилась на 3к строк кода (8.2к), а с учётом сторонних либ почти 14к (а ведь первая версия была примерно 400 строк :D), жесть в общем :) Но полученным результатом я очень доволен и наверное даже горжусь, пускай это звучит громко, но Snakeskin 4 будет объективно самым продвинутым "классическим" (т.е. без привязки к определённой технологии или окружению) шаблонным движком из существующих для JS. |
Цитата:
а вот я будто в астрале пребываю) |
Алилуйя, я закончил фазу активной разработки. Теперь приступаю к обновлению доки и выкатываю релиз :)
|
Добавлю сюда тоже, релизная версия видео-мана по настройке вотчеров.
Планирую также снять видео по основам и по наследованию, а остальное будет только в текстовом виде в вики, которая уже пилится :) |
| Часовой пояс GMT +3, время: 17:05. |