Почти закончил работу, над новой версией, скорее всего во вторник выложу, но возник вопрос, когда переписывал модуль обработки 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 и будет его наследовать. Как вам такое предложение?