Цитата:
например, было бы интересно узнать про 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: 1filter_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, время: 12:55. |