MarkupBuilder从字符串渲染

时间:2011-10-12 04:55:56

标签: grails groovy markupbuilder

我正在使用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
}

1 个答案:

答案 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将值注入格式化的完整标记位