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

melky 03.08.2014 15:15

Цитата:

Сообщение от kobezzza (Сообщение 324056)
Потому, что я сам этого не знаю :) Я веду работу над своим основным проектом, понимаю что мне нужен список фич, откладываю их до тех пор, пока не решаю реализовать в новой версии.

Хотя конечно, я бы мог писать roadmap при начале работы над новой версией.

да) просто , чтобы понимать, что ты хочешь из него сделать.

например, было бы интересно узнать про jade-like синтаксис и инкрементальную сборку шаблонов, ну и про переменные, и layout'ы, и про React и про подсветку синтаксиса ....

короче, вопросов очень много )

kobezzza 03.08.2014 15:32

Цитата:

было бы интересно узнать про jade-like синтаксис
Скоро закончу видео по этой части :)

Цитата:

инкрементальную сборку шаблонов
Ну, я сделаю ручку, которая будет говорить соотвествует ли JS файл с SS по версии, а дальше уже нужно колдовать в отдельных плагинах сборщиков.

UPD: сейчас подумал, что можно придумать логику для {include}, чтобы он не инклудил файл, который может быть взят из кеша.

Цитата:

ну и про переменные, и layout'ы
Тоже будет в видео.

Цитата:

и про React
Тут не понятно: у меня нет биндинга :) Я склоняюсь к тому, что если и делать его, то как отдельная клиентская либа, которая будет юзать Snakeskin, но пока не планируется.

Цитата:

про подсветку синтаксиса
Дык. Я уже про это снял самое первое видео, где рассказывается как её можно добавить. Что качается обработки ошибок, то вывод в терминал от вотчера: snakeskin в 90% случаев ловит ошибку на этапе трансляции и скажет точно где произошла ошибка.

melky 03.08.2014 15:48

Цитата:

Сообщение от kobezzza
Дык. Я уже про это снял самое первое видео, где рассказывается как её можно добавить.

о, я этот момент прослакал) для sublime text придется плагин фигачить

kobezzza 03.08.2014 15:52

Цитата:

Сообщение от melky (Сообщение 324073)
о, я этот момент прослакал) для sublime text придется плагин фигачить

Если делать честную поддержку в WebStorm, то тоже плагин писать, но чёто ради этого Жабу курить лень:)

kobezzza 05.08.2014 16:55

Добавил метод, который компилирует заданный файл (если нужно), кеширует результат и возвращает ссылку на главную функцию: 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 превысило общее количество коммитов всех предыдущих версий :)

kobezzza 05.08.2014 23:27

Перед сном пришла идейка:

- 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)


Завтра реализую :)

kobezzza 08.08.2014 11:16

Добавил перегрузку директивы else

{if 1}
    ...
{else 2} /// тоже самое, что и elseIf
    ...
{/}

{if 1}
    ...
{else if 2} /// тоже самое, что и elseIf
    ...
{/}

{if 1}
    ...
{else unless 2} /// тоже самое, что и elseUnless
    ...
{/}


ЗЫ: странно, что я с самого начала так не сделал, а ввёл новую директиву elseIf, но оставил её для совместимости.

kobezzza 08.08.2014 14:27

Сделал демку 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 /// просто текст
{/}

kobezzza 08.08.2014 15:26

Сам релиз 4-й версии намечен на вечер воскресения.

Safort 08.08.2014 15:48

kobezzza,
нам ждать статейку на Хабре?)

kobezzza 08.08.2014 15:50

Цитата:

Сообщение от Safort (Сообщение 324943)
kobezzza,
нам ждать статейку на Хабре?)

Может быть, но не сейчас. Сейчас меня уже блевать тянет от написания доки, передохну и мб напишу.

melky 08.08.2014 16:28

Цитата:

Сообщение от kobezzza (Сообщение 324944)
Может быть, но не сейчас. Сейчас меня уже блевать тянет от написания доки, передохну и мб напишу.

рекомендую коньяк, отлично расслабляет ;)

kobezzza 08.08.2014 16:42

Цитата:

рекомендую коньяк, отлично расслабляет
Практикую :)

kobezzza 08.08.2014 17:13

Добавил в CLI API возможность запуска скомпиленного шаблона, т.е.

snakeskin -s index.ss -o index.html -d data.json


думаю результат понятен :)

kobezzza 08.08.2014 18:46

Классический пример серверного шаблона

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

kobezzza 09.08.2014 14:26

Обновил 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


А теперь достаточно подставить в конце символ ? и значение константы сразу же выведется в шаблон.

kobezzza 10.08.2014 11:41

Подумываю об интеграции модуля типографии http://mdash.ru/.

melky 10.08.2014 12:38

kobezzza, я писал о нём.

мб просто сделаем порт на JS, а там уже кто куда? я хотел его в ckeditor запихнуть

kobezzza 10.08.2014 12:42

Цитата:

мб просто сделаем порт на JS, а там уже кто куда? я хотел его в ckeditor запихнуть
Я тоже об этом думал. Для начала стоит поискать готовые трансляторы python-to-js или php-to-js, мб ничего и переписывать не придётся :)

***

http://pyjs.org надо покурить

***
***

Перевёл бранч Snakeskin 4 в master. Вики почти готова.

kobezzza 10.08.2014 13:15

melky,

добавил в Wiki ссылку на твой драйвер для Express, но его нужно будет обновить для работы со Snakeskin 4.

melky 10.08.2014 13:51

Цитата:

Сообщение от kobezzza (Сообщение 325140)
melky,

добавил в Wiki ссылку на твой драйвер для Express, но его нужно будет обновить для работы со Snakeskin 4.

ага, займусь по мере времени

kobezzza 10.08.2014 13:53

Цитата:

Сообщение от melky (Сообщение 325143)
ага, займусь по мере времени

Круто, спасибо!

melky 10.08.2014 13:57

Цитата:

Сообщение от kobezzza (Сообщение 325144)
Круто, спасибо!

на самом деле там можно сделать не в виде пакета, а добавить один метод в синглетон Snakeskin (он __express называется или как-то так)

только нужно свериться, проходит ли SS по функционалу и фичам обычного движка шаблонов express

...а meteor и derby в своей базе имеют express ? т.е. middleware для express будет работать и в них?

kobezzza 10.08.2014 14:03

Цитата:

на самом деле там можно сделать не в виде пакета, а добавить один метод в синглетон Snakeskin (он __express называется или как-то так)
А в доке это есть? Я чёто не нашёл с ходу.

Цитата:

только нужно свериться, проходит ли SS по функционалу и фичам обычного движка шаблонов express
Думаю, всё ок.

Цитата:

...а meteor и derby в своей базе имеют express ? т.е. middleware для express будет работать и в них?
Вроде только один из них.

animhotep 10.08.2014 22:53

derby на express-е

melky 11.08.2014 13:32

Цитата:

Сообщение от animhotep (Сообщение 325251)
derby на express-е

А meteor? По моему, они все базируются на express

Кобе, я позже сделаю PR или обновлю биндинг. Сейчас в больнице, машина сбила (

kobezzza 11.08.2014 13:38

Цитата:

Кобе, я позже сделаю PR или обновлю биндинг.
оки!

Цитата:

Сейчас в больнице, машина сбила (
Офигеть:( поправляйся!

***

Дополнительно подключил в онлайн-пример Collection, т.е. можно делать так:

- forEach [1, 2, 3] => {filter: ':el > 1', count: 10} => el
    {el}


и т.д.

animhotep 11.08.2014 17:02

Цитата:

Сообщение от melky
А meteor?

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

kobezzza 12.08.2014 15:24

Проект Snakeskin достиг 1500 коммитов :)

***

Кстати тихим сапом я уже зарелизил версию 4.0.3, но дока ещё не закончена (осталось 2 главы), оч тяжело идёт, задолбался. Завтра доделаю и обновлю плагинчик для Grunt.

kobezzza 14.08.2014 11:30

После 1.5 месяца плотной разработки с радостью готов сообщить, что Snakeskin 4 полностью готов (включая доку, хотя к сожалению видео маны снял не все, т.к. кончилось отведённое время).

Было внесено огромное количество улучшение и изменений.
Большое спасибо тем, кто помогал советом и критикой в формировании данного релиза, особенно melky :)

Также обновил плагин grunt

melky 14.08.2014 16:50

что такое "директива для асинхронной работы" ?
угумс, я видел модуль 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!

kobezzza 14.08.2014 18:22

Цитата:

что такое "директива для асинхронной работы" ?
угумс, я видел модуль async и т.д. , но ... не могу понять асинхронность в движке шаблонов)
Ну, это очень редкий кейс, но иногда бывает нужно и такая поддержка позволяет избавится от попоболи.

- template foo(@param, callback)
    - when ajax(...)
        () => result
            ? callback(getTplResult())


Цитата:

кеширование при рендере файлов. пройдет ли Snakeskin этот тест?
И да, и нет. Там от выходных параметров зависит. Например, если передаётся хеш language, то результат не кешируется.

melky 14.08.2014 19:05

Цитата:

Сообщение от kobezzza
Ну, это очень редкий кейс, но иногда бывает нужно и такая поддержка позволяет избавится от попоболи.

это используется для подгрузки шаблонов на фронтенде? Эдакий requireJS для шаблонов - я верно понял?

kobezzza 14.08.2014 19:32

Цитата:

это используется для подгрузки шаблонов на фронтенде? Эдакий requireJS для шаблонов - я верно понял?
Ну, так тоже можно использовать конечно, а вообще кейс любой где нужна асинхронная работа.

kobezzza 14.08.2014 20:00

Чёто у мя сёня день багов.

Выпустил уже v4.0.10 :)

melky 15.08.2014 12:26

кидает ошибку при использовании плейсхолдера %fileName%. это я виноват или это баг ?)

Лог:
Код:

    SnakeskinError: invalid "template" name, line: 1
---------------------------
> 1 {template %fileName% ()}
---------------------------

Сам файл:
filter_repeat.ss:
Код:

{template %fileName% ()}{'foo'|repeat}{/template}

kobezzza 15.08.2014 12:37

Гмм... ща проверю

UPD: у меня всё работает, можешь описать сценарий: параметры компиляции, где запускаешь (нода или браузер) и т.д.

Написал тест для этой проверки, всё ок работает

https://github.com/kobezzza/Snakeski...ts/template.ss

***

Выпустил очередной хотфикс апдейт 4.0.12.

kobezzza 16.08.2014 12:44

Выпустил очередной хотфикс апдейт 4.0.16.

kobezzza 19.08.2014 11:35

Выпустил очередной хотфикс апдейт 4.0.20.

kobezzza 25.08.2014 14:22

Выпустил очередной хотфикс апдейт 4.0.21.


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