autoEscape имеет значение true, но Ratpack не экранирует HTML элементов - PullRequest
0 голосов
/ 01 апреля 2020

С Ratpack 1.6.1 у меня есть шаблон gtpl с элементом div следующим образом:

div('<pre>HELLO</pre>')

Ratpack не экранирует внутренний элемент pre, хотя autoEscape это true. Есть ли способ исправить / обойти проблему?

PS autoEscape в TemplateConfiguration по умолчанию true. Установка true явно тоже не помогает:

module(MarkupTemplateModule) { TemplateConfiguration config ->
    config.baseTemplateClass = MarkupTemplateExtensions
    config.autoEscape = true
}

1 Ответ

0 голосов
/ 08 апреля 2020

Наконец разобрался с ответом:

autoEscape не позволяет экранировать в шаблонах. Он позволяет только экранировать данные, переданные непосредственно в groovyMarkupTemplate, например:

<code>groovyMarkupTemplate('template.gtpl', var: '<pre>Escaped
')

Решение

Чтобы включить экранирование во всех шаблонах по умолчанию, это необходимо создать подкласс BaseTemplate следующим образом:

Примените наш собственный шаблонизатор в Ratpack. groovy

bindings {

   module(MarkupTemplateModule) { TemplateConfiguration config ->
       config.baseTemplateClass = MyMarkupTemplate
   }
}

Подкласс BaseTemplate и метод переопределенияMissing ( ):

@InheritConstructors
abstract class MyMarkupTemplate extends BaseTemplate {
    @Override
    Object methodMissing(String tagName, Object args) {

        if (args instanceof Object[]) {
            Object[] argsArray = (Object[])args

            // Traverse argsArray ans escape every instance of String
            // with XmlUtil.escapeXml()

            return super.methodMissing(tagName, argsArray)
        }

        super.methodMissing(tagName, args)
    }
}
...