Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 24.06.2013, 21:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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


Сообщение от kobezzza
Но, я думаю о возможности указывать scope явно при вызове прототипа.
звучит неплохо. Только, если прототип не указан явно, надо что-нибудь подставить по умолчанию
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #22 (permalink)  
Старый 25.06.2013, 11:51
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

Сообщение от nerv_ Посмотреть сообщение
звучит неплохо. Только, если прототип не указан явно, надо что-нибудь подставить по умолчанию
Это пока фантазия, т.к. не могу придумать как это лучше реализовать с точки зрения синтаксиса (да и с точки зрения реализации придётся повозится ).

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

Ща пью кофе, делаю финальные тесты, рефакторинг и обновляю доку К вечеру всё буит наверно
__________________
kobezzza
code monkey
Ответить с цитированием
  #23 (permalink)  
Старый 25.06.2013, 12:51
Аватар для animhotep
Профессор
Отправить личное сообщение для animhotep Посмотреть профиль Найти все сообщения от animhotep
 
Регистрация: 17.01.2013
Сообщений: 887

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


теги все там закрыты, так что хз чего он хочет
Ответить с цитированием
  #24 (permalink)  
Старый 25.06.2013, 13:08
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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


теги все там закрыты, так что хз чего он хочет
Гм, разберусь.

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

Последний раз редактировалось kobezzza, 25.06.2013 в 13:19.
Ответить с цитированием
  #25 (permalink)  
Старый 25.06.2013, 19:08
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Фух, вроде закончил работу на версией 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
code monkey

Последний раз редактировалось kobezzza, 25.06.2013 в 20:13.
Ответить с цитированием
  #26 (permalink)  
Старый 26.06.2013, 16:02
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

npm install -g snakeskin


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

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

Последний раз редактировалось kobezzza, 26.06.2013 в 16:29.
Ответить с цитированием
  #27 (permalink)  
Старый 26.06.2013, 16:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,052

Сообщение от kobezzza
Поиграться с шаблоном можно здесь
ие не будет грузить скрипт с гитхаба в нём непосмотреть.
Ответить с цитированием
  #28 (permalink)  
Старый 26.06.2013, 16:28
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от рони Посмотреть сообщение
ие не будет грузить скрипт с гитхаба в нём непосмотреть.
Угу, уже пофиксил
__________________
kobezzza
code monkey
Ответить с цитированием
  #29 (permalink)  
Старый 26.06.2013, 18:20
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

правильно понимаю, что это http://jsfiddle.net/NAPWB/3/ должно работать?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #30 (permalink)  
Старый 26.06.2013, 18:31
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
правильно понимаю, что это http://jsfiddle.net/NAPWB/3/ должно работать?
Должно, это баг. Сейчас разберусь.

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

Последний раз редактировалось kobezzza, 26.06.2013 в 18:45.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
express-snakeskin - view через snakeskin для express melky Ваши сайты и скрипты 5 10.06.2014 11:35