Цитата:
например, было бы интересно узнать про jade-like синтаксис и инкрементальную сборку шаблонов, ну и про переменные, и layout'ы, и про React и про подсветку синтаксиса .... короче, вопросов очень много ) |
Цитата:
Цитата:
UPD: сейчас подумал, что можно придумать логику для {include}, чтобы он не инклудил файл, который может быть взят из кеша. Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Добавил метод, который компилирует заданный файл (если нужно), кеширует результат и возвращает ссылку на главную функцию: https://github.com/kobezzza/Snakeski...keskin.es6#L67
Главная функция определяется по правилу: return tpl[path.basename(src, '.ss')] || tpl.main || tpl[Object.keys(tpl)[0]] || null; Пример использования: profile.ss - template %fileName%(@params) Hello {@name}! var snakeskin = require('snakeskin'); snakeskin.execFile('./profile.ss')({name: 'Вася'}) // Hello Вася! ЗЫ: количество коммитов в версию 4 превысило общее количество коммитов всех предыдущих версий :) |
Перед сном пришла идейка:
- template foo(a|trim, b|parse) ... Тоже самое, что и - template foo(a, b) ? a = (a|trim) ? b = (b|parse) ?? Вопрос, должен ли такой фильтр накладываться на значение по умолчанию... думаю - нет. - template foo(a|trim = 'foo') ... <=> - template foo(a) ? a = a != null ? (a|trim) : 'foo' И самое-вызываемые прототипы - template foo(a|trim, b|parse) - proto bar(a, b) => 1, 2 ... Тоже самое, что и - template foo(a|trim, b|parse) - proto bar(a, b) ... - apply bar(1, 2) Завтра реализую :) |
Добавил перегрузку директивы else
{if 1} ... {else 2} /// тоже самое, что и elseIf ... {/} {if 1} ... {else if 2} /// тоже самое, что и elseIf ... {/} {if 1} ... {else unless 2} /// тоже самое, что и elseUnless ... {/} ЗЫ: странно, что я с самого начала так не сделал, а ввёл новую директиву elseIf, но оставил её для совместимости. |
Сделал демку RC версии Snakeskin 4, можно поиграться.
http://jsfiddle.net/kobezzza/NAPWB/10/ Описание Jade-Like синтаксиса Резюме: В Snakeskin директивы размещаются в { ... } {template foo()} ... {/} В некоторых случаях использовать такую форму не удобно (например для генерации JS-скрипта), поэтому была введена расширенная форма #{ ... }, которая работает по принципу: все вложенные директивы также должны использовать такую форму. {template foo()} #{script js} var a = {b: #{1 + 2}}; #{/} {/} В Jade-Like вместо юзает - и # - template foo() # script js var a = {b: #{1 + 2}}; Но также у некоторых директив есть короткая форма, например, у void (?), tag(<) и т.д. {template foo()} {?alert(1)} /// тоже самое, что и {void alert(1)} {/} В JadeLike можно использовать эти сокращения и не писать - - template foo() ? alert(1) /// вместо - void alert(1) или - ? alert(1) #? alert(1) /// расширенная форма Чтобы юзать Jade-Like вне шаблона, то просто берём и пишем - var a = 1 - if a - global b = 2 Синтаксис можно совмещать - var a = 1 {if a} - global b = 2 {/} Но при декларации шаблона, чтобы юзать Jade-Like необходимо саму декларацию также заюзать в таком синтаксисе - template foo() - var a = 1 |- var a = 1 /// специальный символ | означает, что это текст, а не начало директивы {template foo()} - var a = 1 /// просто текст {/} |
Сам релиз 4-й версии намечен на вечер воскресения.
|
kobezzza,
нам ждать статейку на Хабре?) |
Цитата:
|
Цитата:
|
Цитата:
|
Добавил в CLI API возможность запуска скомпиленного шаблона, т.е.
snakeskin -s index.ss -o index.html -d data.json думаю результат понятен :) |
Классический пример серверного шаблона
base.ss - template %fileName%(@params) - doctype < html < head < title :: {@title} - block script < script js src = foo.com/bar.js < body profile.ss - include 'base.ss' - template %fileName%(@params) extends base - block script - super /// директива подставляет родительское значение блока < script js src = foo.com/profile.js |
Обновил RC версию. Добавил новую прикольную фичу: вызываемая константа.
base.ss - template %fileName%(@params) - doctype < html < head < title :: {title = 'Базовый шаблон'?} < body profile.ss - include 'base.ss' - template %fileName%(@params) extends base - title = 'Страница профиля' Т.е. раньше нужно было делать так: - template %fileName%(@params) - doctype < html < head {title = 'Базовый шаблон'} < title :: {title} < body А теперь достаточно подставить в конце символ ? и значение константы сразу же выведется в шаблон. |
Подумываю об интеграции модуля типографии http://mdash.ru/.
|
kobezzza, я писал о нём.
мб просто сделаем порт на JS, а там уже кто куда? я хотел его в ckeditor запихнуть |
Цитата:
*** http://pyjs.org надо покурить *** *** Перевёл бранч Snakeskin 4 в master. Вики почти готова. |
melky,
добавил в Wiki ссылку на твой драйвер для Express, но его нужно будет обновить для работы со Snakeskin 4. |
Цитата:
|
Цитата:
|
Цитата:
только нужно свериться, проходит ли SS по функционалу и фичам обычного движка шаблонов express ...а meteor и derby в своей базе имеют express ? т.е. middleware для express будет работать и в них? |
Цитата:
Цитата:
Цитата:
|
derby на express-е
|
Цитата:
Кобе, я позже сделаю PR или обновлю биндинг. Сейчас в больнице, машина сбила ( |
Цитата:
Цитата:
*** Дополнительно подключил в онлайн-пример Collection, т.е. можно делать так: - forEach [1, 2, 3] => {filter: ':el > 1', count: 10} => el {el} и т.д. |
Цитата:
они своё пилят, туда не катят модули ноды в отличие от дерби |
|
После 1.5 месяца плотной разработки с радостью готов сообщить, что Snakeskin 4 полностью готов (включая доку, хотя к сожалению видео маны снял не все, т.к. кончилось отведённое время).
Было внесено огромное количество улучшение и изменений. Большое спасибо тем, кто помогал советом и критикой в формировании данного релиза, особенно melky :) Также обновил плагин grunt |
что такое "директива для асинхронной работы" ?
угумс, я видел модуль async и т.д. , но ... не могу понять асинхронность в движке шаблонов) кеширование при рендере файлов. пройдет ли Snakeskin этот тест? (readCount - это счетчик вызовов fs.readFile в nodejs) specify "should support cache on demand" (done) !-> # рендерим файл несколько раз (err, tmpl) <-! engine .renderFile "#{fixtures-path}/args.ss", {+cache} (err, tmpl) <-! engine .renderFile "#{fixtures-path}/args.ss", {+cache} (err, tmpl) <-! engine .renderFile "#{fixtures-path}/args.ss", {+cache} if err then return done err # но на самом деле он читается только один раз expect readCount .to .be .eq 1 done! |
Цитата:
- template foo(@param, callback) - when ajax(...) () => result ? callback(getTplResult()) Цитата:
|
Цитата:
|
Цитата:
|
Чёто у мя сёня день багов.
Выпустил уже v4.0.10 :) |
кидает ошибку при использовании плейсхолдера %fileName%. это я виноват или это баг ?)
Лог: Код:
SnakeskinError: invalid "template" name, line: 1 filter_repeat.ss: Код:
{template %fileName% ()}{'foo'|repeat}{/template} |
Гмм... ща проверю
UPD: у меня всё работает, можешь описать сценарий: параметры компиляции, где запускаешь (нода или браузер) и т.д. Написал тест для этой проверки, всё ок работает https://github.com/kobezzza/Snakeski...ts/template.ss *** Выпустил очередной хотфикс апдейт 4.0.12. |
Выпустил очередной хотфикс апдейт 4.0.16.
|
Выпустил очередной хотфикс апдейт 4.0.20.
|
Выпустил очередной хотфикс апдейт 4.0.21.
|
Часовой пояс GMT +3, время: 17:08. |