pasaran / yate

Yet Another Template Engine
MIT License
214 stars 28 forks source link

Вывод заэкранированной разметки через html() #231

Closed vitkarpov closed 10 years ago

vitkarpov commented 10 years ago
html("<h1>Hello, words!</h1>")
html("&lt;h1&gt;Hello, words!&lt;/h1&gt;")

В итоге парсится как html в обоих случаях. Это предполагаемое поведение? Ожидал во втором случае увидеть строку безопасно отображающуюся как текст в браузере.

pasaran commented 10 years ago

Там, видимо, проблема в названии функции ) Все эскейпится автоматически, так что то, что ты хочешь, это:

"<h1>Hello, words!</h1>"

А функция html() наоборот, выводит что-то без эскейпинга. Это как в xslt было disable-output-escaping.

vitkarpov commented 10 years ago

Да, мне действительно нужно использовать именно html. Поясню:

Есть функция, которая возвращает строчку. Назовем ее i18n_unsafe. Пусть эта функция при определенном наборе значений аргументов возвращает: &lt;h1&gt;Hello, words!&lt;/h1&gt;.

Мне нужно вставить это в шаблоне, так что в итоге браузер вывел это как текст, а не парсил как html (строчка возвращается честно заэкранированной).

Я думал, что html в данном случае выведет как есть: дали строку с эскпейпингом, выведет с эскейпингом и в итоге будет то, что нужно.

pasaran commented 10 years ago

А, я понял. Смотри:

match / {
    html( .foo )
}
nop@deirdre ~/reps/yate-master (master)$ ./yate a.yate '{ foo: "&lt;h1&gt;Hello, words!&lt;/h1&gt;" }'
&lt;h1&gt;Hello, words!&lt;/h1&gt;

Все ок. Но когда ты пишешь вот так:

match / {
    html( "&lt;h1&gt;Hello, words!&lt;/h1&gt;" )
}

то тут да, тут в строках резолвятся энтити. Но когда у тебя данные откуда-то еще, то там все ок.

vitkarpov commented 10 years ago

Т.е. получается сработает так:

// foo == "&lt;h1&gt;Hello, words!&lt;/h1&gt;"
foo = i18n_unsafe(...)
html(foo)

?

И так энтити резолвится не будут?

pasaran commented 10 years ago

Да, ну ты попробуй и проверь, делов-то :)

Энтити резолвятся при компиляции только. Т.е. в строковых константах ( "...." ) в шаблонах только. В динамических данных ничего не резолвится, там только эскейпинг.

vitkarpov commented 10 years ago

:+1: Спасибо