Тема: Snakeskin
Показать сообщение отдельно
  #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
Ответить с цитированием