我正在使用MarkupBuilder来从taglib渲染一些HTML,如下所示(为了清楚起见,将其删除):
def formContainer = new MarkupBuilder(out)
formConainer.form() {
input() { }
input() { }
}
现在假设在form()内的某处,我想插入用户指定的某些元素,因此在文件系统上的文件中,我有类似的内容(再次简化)。
select() {
option()
option()
}
我的问题是,如果我读到select in in a String,taglib是否有一种方法可以将其解析为Groovy并将其作为MarkupBuilder实例的一部分?
def formContainer = new MarkupBuilder(out)
formConainer.form() {
input() { }
input() { }
// I want the select to render here
}
最佳答案
一种这样做的方法是:
String externalMarkup = '''
select() {
option()
option()
}
'''
def out = new StringWriter()
def formContainer = new groovy.xml.MarkupBuilder( out )
formContainer.form() {
input()
input()
// Wrap the string in { -> ... } to make it a closure, and evaluate it
def extern = new GroovyShell().evaluate( "{ it-> ${externalMarkup} }" )
// Set the delegate of this closure to the MarkupWriter
extern.delegate = formContainer
// Then execute the closure
extern()
}
println out.toString()
但是,这让我感到脆弱...
更好的方法可能是使用GroovyTemplateEngine将值注入(inject)格式化的完整标记中