我正在使用MarkupBuilder从taglib中渲染一些HTML(为清晰起见而剥离):
def formContainer = new MarkupBuilder(out)
formConainer.form() {
input() { }
input() { }
}
现在假设在form()中的某个地方我想要引入用户指定的一些元素,所以在文件系统的文件中我有这样的东西(再次,简化)......
select() {
option()
option()
}
我的问题是,如果我读取select作为字符串,是否有一种方法可以让taglib将其解析为groovy并使其成为MarkupBuilder实例的一部分?
def formContainer = new MarkupBuilder(out)
formConainer.form() {
input() { }
input() { }
// I want the select to render here
}
答案 0 :(得分:1)
执行此操作的一种方法是:
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将值注入格式化的完整标记位