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

kobezzza 07.02.2015 16:28

Цитата:

Сообщение от melky (Сообщение 355537)
угумс. только до меня не доходит, как тогда передавать данные

Поиск по DOM и установка вручную, можно написать функцию helper :)

Gozar 08.02.2015 00:48

kobezzza,
А может шаблон собираться из разных файлов.

html.ss
{template html(@param)}
{/}


header.ss
{template header(@param)}
{/}


main.ss
{include 'html.ss'}
{include 'header.ss'}

{template main(param) extends html}

{block header}
{super}
{/}
{/template}


Или только proto и apply?

kobezzza 08.02.2015 10:42

Конечно, такой приём по аналогии с классическими языками (от слова класс) называется "композицией". Самый удобный способ сделать это - это использовать директиву call.

{template foo(a, b)}
    {a + b}
{/}

{template bar()}
    {call foo(1, 2)} /// 3
{/}


Цитата:

Или только proto и apply?
proto - apply и block - callBlock ассоциированы с конкретным шаблоном и являются его методами, т.е. они участвуют при наследовании, а в примере выше у нас 2-а независимых шаблона.

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

Gozar 08.02.2015 11:30

Цитата:

Сообщение от kobezzza
стараюсь отдавать предпочтение наследованию, т.к. в таком случае архитектура более управляемая и ясная, а композицию могу использовать, где она явно напрашивается.

Предпочитаю наследование+композиция. Получается очень гибко и расширяемо. Если сайт маленький, то можно просто наследование, если сайт предполагается большой, то тогда наследование+композиция. :)

melky 08.02.2015 12:41

Цитата:

Сообщение от Gozar (Сообщение 355618)
Предпочитаю наследование+композиция. Получается очень гибко и расширяемо. Если сайт маленький, то можно просто наследование, если сайт предполагается большой, то тогда наследование+композиция. :)

самые модные слова 2015: композиция, категории, чистые функции, иммутабельность, функторы, монады, FUCK WHAT ARE GOING HERE

Gozar 11.02.2015 00:12

kobezzza,
Пару вопросов.

1. proto может быть только один?
2. block или blocks? В чем отличия или это опечатка?
Цитата:

Сообщение от https://github.com/kobezzza/Snakeskin/wiki/block
{blocks hello(@params)}

Цитата:

Сообщение от https://github.com/kobezzza/Snakeskin/wiki/block
{block hello()}

ps:
{@des|br|!html}
Фильтры клева. Немного чудно, что !html отменяет html, который задается неявно, но клева :)

kobezzza 11.02.2015 08:46

Цитата:

1. proto может быть только один?
Сколько угодно, но имя должно быть уникально в рамках шаблона, внутрь также можно включать другие прототипы и блоки, есть ещё анонимные прототипы - они нужны когда просто нужно сделать рекурсию (которая кстати, оптимизируется), но не хочется вводить именованный элемент. Размещать прототипы (как и вызываемые блоки) можно как в шаблоне, так и вне до декларации шаблона, к которому они принадлежат, можно выносить в отдельный файл.

{proto foo->some(a, b)}
    {a + b}
{/}

{template foo()}
    {proto bar(a)}
        {a * 2}
    {/}

    {apply some(1, 2)} /// 3
    {apply bar(2)} /// 4
{/}


Цитата:

2. block или blocks? В чем отличия или это опечатка?
Опечатка, есть только block.

Цитата:

Фильтры клева. Немного чудно, что !html отменяет html, который задается неявно, но клева
:)

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

{var a = '  fooo '|trim}

{if ' fooo  '|trim}


и т.д.

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

{var a = (' ffffuuu '|trim) + ' bar  '}


Но фильтр !html можно применять только глобально.

PS: на меня тут гора дел навалилась, поэтому не смог сделать релиз как обещал :( Буду стараться к концу этой недели сделать.

Gozar 11.02.2015 11:42

Цитата:

Сообщение от kobezzza
на меня тут гора дел навалилась, поэтому не смог сделать релиз как обещал Буду стараться к концу этой недели сделать.

Ну главное стабильность. Я тут попробовал объявить 2 прототипа, а затем вызвать их из унаследовавшего шаблона, не вышло, они даже не скомпилились в родительском. Потихоньку играюсь, если выявлю, что это странное поведение, напишу в и issue.

kobezzza 11.02.2015 21:57

Цитата:

Сообщение от Gozar (Сообщение 356080)
Ну главное стабильность. Я тут попробовал объявить 2 прототипа, а затем вызвать их из унаследовавшего шаблона, не вышло, они даже не скомпилились в родительском. Потихоньку играюсь, если выявлю, что это странное поведение, напишу в и issue.

Можешь описать в примере? Просто если это бага, то она носит критический характер, но надеюсь, что это не так. А что говорит отладчик SS?

Вот сделал примерчик, где идёт использование прототипов при наследовании, причём один из прототипов переопределяется.

http://jsfiddle.net/NAPWB/15/

PS: хороший пример возможных вариантов использования можно глянуть в тестах, для прототипов, например,

https://github.com/kobezzza/Snakeski.../test/proto.ss
https://github.com/kobezzza/Snakeski...test/proto2.ss

(шаблоны расположены между ###, а остальное данные для тестового скрипта)

Gozar 11.02.2015 23:04

Цитата:

Сообщение от kobezzza
Можешь описать в примере?

test_html.ss
{template html(@param)}
    <html>
        <body>
            {block body}
                {proto des(@des)}
                    <div class="des">{@des}</div>
                {/proto}
            {/block}
        </body>
    </html>

{/template}


test.ss
{include 'test_html.ss'}

{template main(param) extends html}

   {block body}

        <div class="wrap">

                {apply des()}

        </div>
    {/}

{/template}


des + <div class="des"></div> нет ни в test_html.ss.js ни в test.ss.js. То есть он не компилится.


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