0

使用 Ratpack 1.6.1,我有一个带有 div 元素的 gtpl 模板,如下所示:

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

pre即使autoEscape是,Ratpack 也不会逃脱内部元素true。有没有办法解决/解决这个问题?

默认情况下autoEscape,TemplateConfiguration 中的PS 。true将其设置为true显式也无济于事:

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

1 回答 1

0

终于想通了答案:

autoEscape不启用模板中的转义。它只允许转义直接传递到groovyMarkupTemplate的数据,如下所示:

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

解决方案

为了在所有模板中默认启用转义,有必要像这样子BaseTemplate类化:

在 Ratpack.groovy 中应用我们自己的模板处理器

bindings {

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

子类 BaseTemplate 并覆盖 methodMissing():

@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)
    }
}
于 2020-04-08T12:45:57.720 回答