Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Бросать ошибку при попытке вывода атрибута в неправильном контексте #206

Open
chestozo opened this issue Aug 26, 2013 · 16 comments

Comments

@chestozo
Copy link
Contributor

Исправлено by pasaran@:

<div>
    "Hello"
    //  тут должна быть ошибка!
    @class = "hello"
</div>

Дальше оригинальный пост:

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

  • если первый шаблон рендерит какую-то ноду то
  • атрибут из второго шаблона не проставляется

Пример:

match .* attr1 {
  @class += ' class1'
}

match .* attr2 {
  @class += ' class2'
  <div/>
}

match .* attr3 {
  @class += ' class3'
}

match / {
  <div>
    apply . attr1
    apply . attr2
    apply . attr3
  </div>
}

Получаем на выходе:

<div class=" class1 class2">
  <div></div>
</div>

Хочется видеть:

<div class=" class1 class2 class3">
  <div></div>
</div>

Это by design или можно допилить? )

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Это у тебя опечатка.
Два раза apply . attr2.

@chestozo
Copy link
Contributor Author

Не не не )
Поправил опечатку.
Работает как описано.

@chestozo
Copy link
Contributor Author

Заводить тест и пулреквестить? )

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Помимо опечатки все правильно. By design.
Атрибут прицепляется к текущему открытому тегу.
<div/> очевидно этот тег закрывает. Так же как просто:

<div>
    @class += 'class1'
    <div/>
        @class += 'class2'
</div>

Второй атрибут никуда не будет цепляться, так как никакого открытого тега в этом месте нет.
Это работает так же, как и в xsl.

@chestozo
Copy link
Contributor Author

А разве не так

<div>
    @class += 'class1'
    @class += 'class2'
    <div/>
    @class += 'class3'
</div>

?

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Ну да, мне лень третий было писать. Без разницы.
Любой контент кроме атрибутов (текст, тег) закрывает текущий тег и больше в этом месте атрибутов быть не может.

@chestozo
Copy link
Contributor Author

А зачем закрывается текущий открытый тэг? )

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Потому что ты вывел другой открывающий тег.

@chestozo
Copy link
Contributor Author

А сделать стек тэгов ведь можно? )
Чтобы после закрытия тэга текущим становился предыдущий в стеке?

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Слишком сложно.

@chestozo
Copy link
Contributor Author

xsl, кстати, падает вот так:
xsl:attribute: Cannot add attributes to an element if children have been already added to the element.

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Ну чтобы падало могу сделать )

@chestozo
Copy link
Contributor Author

Кто бы сомневался )
Ты лучше скажи: это из-за того, что рендерится на лету?
А если бы вначале строилось DOM дерево, а потом рендерилось — было бы всё ок, так ведь? )

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Никакой особо разницы нет.
Только "ДОМ"-дерево это очень медленно.

@chestozo
Copy link
Contributor Author

Давай тогда хотя бы ошибку кидать, чтобы не было неявного )

@pasaran
Copy link
Owner

pasaran commented Aug 26, 2013

Угу. Поправил первый пост и название.
Пусть висит.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants