Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Templating System for Node.JS. (https://javascript.ru/forum/project/27690-templating-system-node-js.html)

B~Vladi 21.04.2012 17:02

Templating System for Node.JS.
 
Допилил. Наконец-то.
В общем, тем кто ещё не знает, хочу рассказать про свой шаблонизатор для NodeJS.

Исходники: https://github.com/B-Vladi/TSN

Основные характеристики:
  • Простота. Т.е. это классический шаблонизатор, типа CTPP. Не требуется изучать новый синтаксис. Используется только HTML и JS.
  • Гибкость. За счет переменных и динамической подстановки контекста.
  • Скорость. Рвет fest, а fest рвет CTPP. Так же рвет Dust и Mu.
  • Расширяемость. Свои теги можно реализовать в этом файле, используя API шаблонизатора. Под это документации пока нет, но всегда можно подсмотреть в других тегах или спросить у меня.
  • IDE-friendly. Подсветка, автокомплит и валидация (если подцепить DTD к IDE), Zen-coding, не ломает синтаксис.

Некоторые моменты:
  • Подчищает отступы и переводы строк так, если бы шаблон изначально писался без тегов TSN.
  • При использовании TSN-сущности, допустимы только символы /a-z0-9\-_\./, в соответствии со спецификацией XML.
  • При парсинге корректно обрабатывает ошибки вложенности тегов. Обрабатывает только TSN-теги.
  • Скомпилированный шаблон можно отправить на клиент и юзать там, но для этого лучше использовать специально заточенные под это шаблонизаторы, имхо.
  • В значениях атрибутов тегов TSN можно использовать следующие сущности: & < > " ', а можно и не использовать, кому как больше нравиться.

На данный момент нет такого же классического XML-шаблонизатора для ноды. Да и XML-шаблонизаторов я знаю только 2 - Fest и TSN.

Убедительная просьба: не разводить holy war на тему - "Синтаксис XML - говно, юзай Dust".

Gozar 22.04.2012 02:06

Поставлю 12 бубунут под кедами прикручу туда nodeJS и попробую сие творение ;)

B~Vladi 22.04.2012 02:08

Gozar, не обязательно, сие заводится даже из-под окон :yes:

B~Vladi 22.04.2012 21:14

Довёл до ума документацию: разбил по wiki-страницам, описал остальные моменты. Вникнуть в суть стало теперь намного проще :)

Осталось только написать мануал по API создания тегов.

B~Vladi 23.04.2012 18:20

:blink: Вышла новая версия - 2.0.3.

Что изменилось:
1. Добавлен тег set, для изменения значения ранее созданной переменной (тег var). Работает точно по такому же принципу, как и тег var.
2. Добавлен атрибут item в теги for и each, что бы не приходилось явно сохранять текущий элемент массива/значение текущего свойства в переменную.

B~Vladi 26.04.2012 18:46

Я понимаю, что всем похуй, но всё же...
:blink: Вышла новая версия - 2.1.0

Что изменилось:
1. Выпилил тег set за ненадобностью ;)
2. Теперь переменные из внешнего шаблона не доступны в подключаемых, дабы не прострелить себе ногу.
3. Добавлен метод extend, для расширения набора тегов из кода.
4. Пойманы и наказаны несколько багов.
5. Расширилось API тегов.

Приведу пример шаблона:
page.xml:
<tsn:root xmlns:tsn="TSN">
        <!-- Создаем скрипт для хедера -->
        <!-- Сначала сгенерируем конечный результат и сохраним в переменную -->
        <tsn:var name="header">
            <script type="text/javascript">
                //<![CDATA[
                console.log();
                //
                ]]>
            </script>
        </tsn:var>

        <!-- А при вызове шаблона просто будем возвращать результат -->
        <tsn:template name="header">
            <tsn:echo text="_var.header" />
        </tsn:template>

        <!-- Контент страницы -->
        <tsn:template name="body">
            <div>Body</div>
        </tsn:template>

        <!-- Подключаем базовый шаблон -->
        <tsn:include src="base.xml" context="this.globalData" />
    </tsn:root>



Файл с базовой разметкой base.xml:
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <link href="base.css" type="text/css" rel="stylesheet"/>
            <!-- Здесь будет выводиться стили для конкретной страницы -->
            <tsn:include name="header" />
        </head>
        <body>
            <!-- Вставляем навигацию с передачей необходимых данных -->
            <tsn:include src="common/navigation.xml" context="this.navigation" />
            <!-- Вставляем контент, который был определён ранее и унаследован здесь -->
            <tsn:include name="body" />
            <!-- Вставляем футер с передачей необходимых данных -->
            <tsn:include src="footer.xml" context="this.footer" />
        </body>
    </html>


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

Gozar 26.04.2012 20:50

Цитата:

Сообщение от B~Vladi (Сообщение 171440)
Я понимаю, что всем похуй, но всё же...

Мне интересно, но сейчас не до этого :)

B~Vladi 26.04.2012 22:36

Цитата:

Сообщение от Gozar
Мне интересно, но сейчас не до этого

Я так понял тут нодой никто не балуется. Щас запилю ещё один кейс в новой версии и на хабр тогда напишу. Тут как-то всё тихо. vflash тоже молчит, наверно обидно что их шаблонизатор медленнее.

B~Vladi 27.04.2012 11:23

Цитата:

Сообщение от B~Vladi
запилю ещё один кейс

Как и обещал:

:blink: Вышла новая версия - 2.1.1

Что изменилось:
1. Теперь в теге include абсолютные пути в атрибуте src начинаются с TSN.config.templateRoot. Относительные пути начинаются с папки текущего шаблона или от TSN.config.templateRoot, если текущий шаблон компилируется методом TSN.compile.
2. Пофикшен мелкий баг.

Более серьёзных правок не предполагается, все основные моменты, которые хотел реализовать - реализовал. Если пользователи будут предлагать достойные изменения - буду впиливать.

vflash 27.04.2012 14:11

Цитата:

Сообщение от B~Vladi
vflash тоже молчит, наверно обидно что их шаблонизатор медленнее.

яж писал что к ним отношение не имею. да и TSN не шибко быстрее, у них try catch и выход идет в поток, а у TSN в переменную. Да и что у них что у TSN на выходе XHTML а не HTML. Контрольный в голову, TSN парсит XML-шаблон регулярками.

И между прочем я тебе помогал с тестированием )


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