从字符串渲染 MarkupBuilder

发布于 2024-12-09 21:47:10 字数 577 浏览 0 评论 0原文

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

I'm using MarkupBuilder to render some HTML from a taglib like so (stripped down for clarity):

def formContainer = new MarkupBuilder(out)
formConainer.form() {
   input() { }
   input() { }
}

Now assume that somewhere inside the form() I want to pull in some elements specified by a user so in a file on the file system I have something like this (again, simplified)...

select() {
  option()
  option()
}

My question is, if I read that select in as a String, is there a way for the taglib to parse it as groovy and make it part of the MarkupBuilder instance?

def formContainer = new MarkupBuilder(out)
formConainer.form() {
   input() { }
   input() { }

   // I want the select to render here
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不羁少年 2024-12-16 21:47:10

执行此操作的一种方法是:

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 将您的值注入到格式化的完整标记中

One method for doing this would be:

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()

However, this feels brittle to me...

A better method might be to use the GroovyTemplateEngine to inject your values into a formatted complete bit of markup

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文