Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Snakeskin (https://javascript.ru/forum/project/35057-snakeskin.html)

nerv_ 24.06.2013 21:48

Цитата:

Сообщение от kobezzza
Мой шаблонизатор поддерживают директиву with (в JS with не используется), которая позволяет явно указывать контекст поиска свойств объекта, т.е. :

к слову, в бэйсике (vbscript) директива with работает следующим образом:
with obj1
    .prop = 2; // магическая точка очень кстати
end with


Цитата:

Сообщение от kobezzza
Но, я думаю о возможности указывать scope явно при вызове прототипа.

звучит неплохо. Только, если прототип не указан явно, надо что-нибудь подставить по умолчанию :)

kobezzza 25.06.2013 11:51

Цитата:

Сообщение от nerv_ (Сообщение 258262)
к слову, в бэйсике (vbscript) директива with работает следующим образом:
with obj1
    .prop = 2; // магическая точка очень кстати
end with

В новой версии, которая наверно сегодня выйдет я сделал похожее решение, но более гибкое. Как зарелизю, так опишу)

Цитата:

Сообщение от nerv_ (Сообщение 258262)
звучит неплохо. Только, если прототип не указан явно, надо что-нибудь подставить по умолчанию :)

Это пока фантазия, т.к. не могу придумать как это лучше реализовать с точки зрения синтаксиса (да и с точки зрения реализации придётся повозится:) ).

По умолчанию раньше у всех прототипов где бы они не были объявлены всегда был был глобальный контекст (относительно шаблона). В новой же версии контекст по умолчанию привязан к родительскому (как я описывал постами выше).

Ща пью кофе, делаю финальные тесты, рефакторинг и обновляю доку:) К вечеру всё буит наверно

animhotep 25.06.2013 12:51

интересно глянуть. сейчас демо с гитхаба ругается
Snakeskin Error: Missing closing or opening tag in the template, node: (class: undefined, id: templates)")!


теги все там закрыты, так что хз чего он хочет

kobezzza 25.06.2013 13:08

Цитата:

Сообщение от animhotep (Сообщение 258343)
интересно глянуть. сейчас демо с гитхаба ругается
Snakeskin Error: Missing closing or opening tag in the template, node: (class: undefined, id: templates)")!


теги все там закрыты, так что хз чего он хочет

Гм, разберусь.

UPD: не были закомитены собранные файлы, теперь всё работает

kobezzza 25.06.2013 19:08

Фух, вроде закончил работу на версией 2.3. На обновление доки сегодня наверно уже сил не хватит, отложу на завтра:)

Итак, почти 5 полных дней (рабочих :)) я потратил на разработку новой версии Snakeskin, что было сделано:
1) Полностью переписана часть, отвечающая за анализ и обработку параметров директив:

В прошлых версиях директива with работала крайне криво и только на выводе значений (теперь её поддерживаю почти все директивы),
т.е. конструкция ниже не работала бы

{with myObj}
    {a + b}
{end}


Теперь же with работает ровно так, как от него этого ожидают, т.е. можно использовать сложные выражения и т.д.,
а также появилась возможность указать модификаторы, проще показать:

{with myObj}
    {with foo}
        {with deep}
            {a} /// эквивалентно myObj.foo.deep.a
            
            {#a}  /// эквивалентно myObj.foo.a
            {#2a} /// эквивалентно myObj.a
            {#3a} /// эквивалентно a
            
            {@a}  /// эквивалентно a
            {@@a} /// доступ к супер-глобальной переменной, об этом чуть позже
        {end}
    {end}
{end}


Как видите, теперь появилась возможность точно указывать контекст поиска: модификатор # указывает на то,
что искать свойство нужно на один with блок вверх, а если после решётки указать цифру, например, #2, то на два блока вверх и т.д.
Следует заметить, что # - это более короткая запись #1.
Модификатор @ позволяет сказать, что поиск значения объекта должен осуществляться вне блоков with.

Также теперь в выражениях появилась возможность использовать составные фильтры, т.е.
/// Для переменной a и b отдельно применяется фильтр ucfirst,
/// а затем ко всему выражению фильтр truncate
{(a|ucfirst) + (b|ucfirst) |truncate}


Чтобы ввести составной фильтр, нужно просто взять его декларацию в круглые скобки,
как это сделано на примере выше. Как и с глобальными фильтрами можно использовать несколько фильтров подряд, а также передавать значения в фильтр:

{(a|ucfirst|remove 'foo') + (b|ucfirst) |truncate}
{e = ('foo'|ucfirst)}


В догонку к фильтрам: исправлена ошибка при использовании побитового ИЛИ (|),
теперь считается, что если после | идёт или цифра или пробел, то это операция ИЛИ, а не фильтр:

{0|1} {0 | 1} /// ИЛИ

{a = 1}
{0| a} {0 | a} /// ИЛИ

{0|round} {0 |round} /// Фильтр


2) Супер-глобальные переменные. На самом деле эта фича существовала уже давно, но сейчас я её немного облагородил. Если вкратце:

/// Объявляем супер глобальную переменную
{a = 1}

{template foo()}
    {@a} /// Получаем значение супер глобальной переменной
    
    {with ...}
        {@@a} /// Получаем значение супер глобальной переменной внутри
    {end}
    
    // Объявляем супер глобальную переменную внутри шаблона
    {@e = 1}
{end}


Такие переменные хранятся в Snakeskin.Vars.

3) Директива var. Эта директива позволяет объявлять переменные внутри шаблона.
В отличии от констант переменные могут менять значение в ходе программы, но не могут явно переопределятся в дочернем шаблоне, как константы.

{template foo()}
    {var a = 1}
    {a = 2}
    {a = 3}
{end}


4) Директивы циклов: for, while, repeat/until

{for var i = 0; i < 10; i++}
    ...
{end}

{var i = 100}
{while i--}
    ...
{end}

{var i = 100}
{repeat}
    ...
{until i--}


4) Статичный scope для proto
Как я уже писал выше: теперь при декларации proto блока, он наследует родительский scope.

5) Сахарок:
Для директивы data добавлена короткая форма записи: {{ ... }};
Теперь функцииям-шаблонам в JS ставится свойство name.
Внутри шаблона доступны локальные переменные TPL_NAME и PARENT_TPL_NAME.

В остальном исправления множества ошибок и т.д.

ЗЫ:
И смешно и грустно: первая версия шаблонки была ~400 строк, а эта уже почти 2.7к

kobezzza 26.06.2013 16:02

Зарелизил версию 2.3.4 с исправлением некоторых ошибок.
Также теперь проект добавлен в репозитарий npm, следовательно для простой установки можно сделать:

npm install -g snakeskin


Обновилось консольное АПИ. Подробности в доке на гитхабе или в консольке -h.
Обновилась документация на гитхабе.

Тем кто юзает продукты JetBrains теперь можно оч просто настроить file watcher для шаблона.
Поиграться с шаблоном можно здесь: http://jsfiddle.net/NAPWB

рони 26.06.2013 16:26

Цитата:

Сообщение от kobezzza
Поиграться с шаблоном можно здесь

ие не будет грузить скрипт с гитхаба в нём непосмотреть.

kobezzza 26.06.2013 16:28

Цитата:

Сообщение от рони (Сообщение 258629)
ие не будет грузить скрипт с гитхаба в нём непосмотреть.

Угу, уже пофиксил:)

nerv_ 26.06.2013 18:20

правильно понимаю, что это http://jsfiddle.net/NAPWB/3/ должно работать?

kobezzza 26.06.2013 18:31

Цитата:

Сообщение от nerv_ (Сообщение 258651)
правильно понимаю, что это http://jsfiddle.net/NAPWB/3/ должно работать?

Должно, это баг. Сейчас разберусь.

UPD: поправил, бага наитупейшия была, а воспроизводилось только на пробельных отступах :) Спс за репорт!


Часовой пояс GMT +3, время: 05:32.