Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 19.06.2013, 00:59
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

глупый вопрос - в боевых проектах использовал или сделал и положил на полку?

UPD:
не знаю, как оно там с точки зрения парсинга, но смущает, что:
- циклы
{forEach a => el, i}
{end}

- ифы
{if a > 3}
{end}

- вичи
{with obj}
{end}

- темплейты
{template test(obj)}
{end}

- прото
{proto a}
{end}

- блок
{block a}Вася{end}

заканчиваются на {end} в то время, как
- cdata
{cdata}
{end cdata}

на {end cdata}. Не порядок, однако.

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

Привет бейсик, здравствуй наглядность:
{forEach a => el, i}
{next}

{if a > 3}
{end if}

{with obj}
{end with}

{template test(obj)}
{end template}

{proto a}
{end proto}

{block a}Вася{end block}

{cdata}
{end cdata}
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 19.06.2013 в 01:17.
Ответить с цитированием
  #12 (permalink)  
Старый 19.06.2013, 02:20
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
глупый вопрос - в боевых проектах использовал или сделал и положил на полку?
Конечно использую, этот как бы и писалось под проект (я вроде об этом говорил ), причём огромный, сейчас уже больше 300-шаблонов (пишу несколько лет, но последние пол года на фул тайме, т.к. уволился с работы, Бог даст к НГ сделаю релиз) и многие находятся в зависимостях наследования.

Я очень жирно использую ООП и мне крайне важно было максимально гибкая система наследования в шаблонах, а также одинаково удобная система использования на сервере (node.js) и клиенте.

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

С cdata проблема в том, что содержимое вырезается по регулярке до анализа шаблона и построения дерева, поэтому возможна следующая проблема:

{cdata}
    {end}
{end}


Фактически содержимое внутри блока cdata никак не обрабатывается, поэтому я могу написать что угодно, но в данном случае нужно либо как то экранировать {end} теги внутри области (как например это делается в xml), тому кто пишет шаблон или ввести особый закрывающий тег, как сейчас сделано у меня.

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

{template foo(params, type = 'static')}
    {if type === 'static'}
        муахахаха!
    {else}
        {block bar}
            ...
        {end}
    {end}
{end}
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 19.06.2013 в 02:44.
Ответить с цитированием
  #13 (permalink)  
Старый 19.06.2013, 11:11
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

kobezzza, спасибо за ответ.

По поводу {end} я категорически тебе предлагаю сделать так, как написал выше. Причина - удобство. Я вижу какой тег закрыт Пример
// начало кода
// много букв
    {end}
{end}

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

Можно замутить опрос, но на мой взгляд это скорее минус, чем плюс.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #14 (permalink)  
Старый 19.06.2013, 11:16
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

еще можно пойти по пути html
{foreach} a => el, i}
{/foreach}

{if a > 3}
{/if}

{with obj}
{/with}

{template test(obj)}
{/template}

{proto a}
{/proto}

{block a}Вася{/block}

{cdata}
{/cdata}

т.е. я к тому, что должно быть видно, какой тег закрыт

Сообщение от kobezzza
Конечно использую, этот как бы и писалось под проект (я вроде об этом говорил )
значит я проглядел

Почему развел демагогию: присматриваюсь к твоему шаблонизатору
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 19.06.2013 в 11:19.
Ответить с цитированием
  #15 (permalink)  
Старый 19.06.2013, 11:23
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
kobezzza, спасибо за ответ.

По поводу {end} я категорически тебе предлагаю сделать так, как написал выше. Причина - удобство. Я вижу какой тег закрыт
Я могу добавить реализацию {/...} или {end ...}, это не проблема и даже ничего переделывать не придётся На этой недели или в начале следующей зарелизю новую версию с исправлениями.

Сообщение от nerv_ Посмотреть сообщение
Почему развел демагогию: присматриваюсь к твоему шаблонизатору
Ну если решишься, то пиши, что не так

UPD:
Я протупил, писать {end что то} можно уже сейчас, т.е.
{forEach data => el, i}
{end forEach}


Т.к. парсер обрабатывает директиву, как {названиеДирективы любые условия}, а в случае с end условий нет, т.е. можно писать что угодно и это ничего не сломает

{forEach data => el, i}
{end это конец моего блока}
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 19.06.2013 в 12:37.
Ответить с цитированием
  #16 (permalink)  
Старый 19.06.2013, 11:51
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Добавил поддержку закрытия директив через / , как в xml. Новая версия доступна на гитхабе.

{template foo()}
{/template}


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

Т.е.
{template base()}
    {block foo}
        {var a = 1}
        ...
    {end}
{end}

{template child() extends base}
    /// Переопределяем блок и заодно переменную внутри него
    {block foo}
        {var a = 2}
    {end}
{end}


2) Циклы. Есть задачи, вроде: сгенерить для select-а номер года от 19.. до ныненшнего, а с итератором такое решение выглядит немного странно.

{for var i = 0; i < 10; i++}
    ...
{end}


вместо
{forEach new Array(10) => el, i}
    ...
{end}


3) Также улучшу и задокументирую некоторые нестандартные фичи, о которых сейчас знаю только я

В остальном будет исправление известных ошибок и написание новых тестов.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 19.06.2013 в 12:12.
Ответить с цитированием
  #17 (permalink)  
Старый 19.06.2013, 18:09
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

kobezzza, отлично, спасибо
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #18 (permalink)  
Старый 23.06.2013, 22:33
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Почти закончил работу, над новой версией, скорее всего во вторник выложу, но возник вопрос, когда переписывал модуль обработки scope, а именно:

Мой шаблонизатор поддерживают директиву with (в JS with не используется), которая позволяет явно указывать контекст поиска свойств объекта, т.е. :

{template foo()}
    {my = {
        name: 'Koba',
        age: 23
    }}

    {with my}
        <p>Имя: {name}</p>
        <p>Возраст: {age}</p>
    {end}
{end}


Это очень удобно, особенно когда у нас ссылка вроде myObj.someProp1.someProp2.
А также в моём шаблонизаторе есть "волшебная" директива proto, которая позволяется создавать что-то вроде микрошаблонов.

{template foo()}
    {proto logo}
        <img src="..." alt="моё супер лого" />
    {end}

    <div class="header">
        ...
        {apply logo}
    </div>

    <div class="footer">
        ...
        {apply logo}
    </div>
{end}


Думаю смысл кода выше всем понятен, но всё же поясню: внутри директивы proto мы декларируем часть шаблона, которая не будет выведена сразу после декларации, а только после того, как мы её вызовем, с помощью директивы apply.

А теперь собственно суть проблемы: сейчас директива proto всегда использует глобальный scope шаблона, т.е.

{template foo()}
    {my = {
        name: 'Koba',
        age: 23
    }}

    {with my}
         {proto gen}
            <p>Имя: {name}</p>
            <p>Возраст: {age}</p>
         {end}
         /// Будет ошибка, т.к. прототип всегда использует глобальный контекст шаблона
         {apply gen}
    {end}
{end}


Проблема решается в общем то довольно тривиально: нужно просто поместить директиву with внутрь прототипа, но я подумал, а что если прототипы будут при декларации получать родительский scope, т.е. пример выше сможет корректно работать, т.к. директива proto находится в контексте with и будет его наследовать. Как вам такое предложение?
__________________
kobezzza
code monkey
Ответить с цитированием
  #19 (permalink)  
Старый 24.06.2013, 00:17
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от kobezzza
Как вам такое предложение?
а вот так можно будет делать?
{template foo()}

    {my = {
        name: 'Koba',
        age: 23
    }}

     {proto gen}
        <p>Имя: {name}</p>
        <p>Возраст: {age}</p>
     {end}

    {with my}
         {apply gen}
    {end}

{end}
Ответить с цитированием
  #20 (permalink)  
Старый 24.06.2013, 09:06
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от melky Посмотреть сообщение
а вот так можно будет делать?
{template foo()}

    {my = {
        name: 'Koba',
        age: 23
    }}

     {proto gen}
        <p>Имя: {name}</p>
        <p>Возраст: {age}</p>
     {end}

    {with my}
         {apply gen}
    {end}

{end}
Не, я же делаю статический scope, т.е. определяется в момент декларации, а не в момент вызова. Но, я думаю о возможности указывать scope явно при вызове прототипа.
__________________
kobezzza
code monkey
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
express-snakeskin - view через snakeskin для express melky Ваши сайты и скрипты 5 10.06.2014 11:35