Сегодня потратил день, на сортировку скопившихся "хотелок" от новой версии Snakeskin и утвердил следующее:
1) Директива
{super}
- для безопасной подстановки тела родительского блока или прототипа в указанное место в дочернем.
2) Поддержка параметров для директивы proto
Я долго думал над этой фичей, т.к. сама суть прототипов - это "мягкая" декомпозиция шаблона, с поддержкой механизма наследования и безопасной работой, т.е. замена пресловутых вызовов других шаблонов в шаблоне. В общем получается, что сейчас прототипы могут очень ограниченно выполнять свою функцию, т.к. не хватает двух вещей: параметров и поддержки рекурсии. Ожидаемый синтаксис будет таким:
{template foo(param)}
{proto icon(%iconName)}
{param} - {%iconName}
{end}
{apply icon('foo')}
{end}
Разумеется, старый синтаксис прототипов (без указания параметров) останется рабочим.
3) Поддержка рекурсий в прототипах. Хотя прототип напоминает простые функции JS, но на самом деле это не так, поэтому использование рекурсии изначально было запрещено, ввиду некорректной работы транслятора (он уходил в бесконечный цикл), но любую рекурсию можно представить в виде простого цикла, собственно что я и планирую сделать для рекурсивных прототипов.
4) Директива для конструкции switch-case-default
5) Директивы {return} {break} и {continue} для прерывания в теле директив циклов и прерывания общего шаблона (return)
6) Директива-хэлпер для безопасной работы с атрибутами узлов:
<input {attr 'type', 'text'} />
7) Декларация прототипов вне тела шаблона:
/// Прототип getIcon добавится в конец шаблона foo
{proto foo->getIcon}
...
{end}
8) Поддержка JSDoc комментариев: комментарии вида /** ... */ не будут вырезаться из шаблона и будут вставлены в конечный JS, чтобы можно было использовать их при дальнейшем сжатии с помощью GCC.
В остальном будут исправления ошибок и различные доработки.
Завтра приступаю к реализации.