Groovy TemplateEngine-用于创建标记的函数

Groovy TemplateEngine-用于创建标记的函数,groovy,template-engine,Groovy,Template Engine,我是一名JS程序员,试图编写一些Groovy代码(完全没有Java背景)。我需要使用Groovy编写一些模板,因此我创建了一个函数以避免重复。我的目标是能够将html对象传递给函数(例如:p(),div(),span(),等等),但它没有按照我的预期工作: 功能 void addon ( addonType, mainHolder, content ) { div( class: "addon " + addonType ) { div( class: "addon-main" )

我是一名JS程序员,试图编写一些Groovy代码(完全没有Java背景)。我需要使用Groovy编写一些模板,因此我创建了一个函数以避免重复。我的目标是能够将html对象传递给函数(例如:
p()
div()
span()
,等等),但它没有按照我的预期工作:

功能

void addon ( addonType, mainHolder, content ) {
  div( class: "addon " + addonType ) {
    div( class: "addon-main" ) {
      div( class: "addon-main-holder" ) {
        yieldUnescaped mainHolder
      }
    }

    div( class: "addon-content" ) {
        yieldUnescaped content
    }
  }
}
不起作用

[...]
  body {
    addon( 'addon-warning', p('Lorem Ipsum'), p('Dolor sit amet consectetur') )
  }
[...]
[...]
  body {
    addon( 'addon-warning', '<p>Lorem Ipsum</p>', '<p>Dolor sit amet consectetur</p>') )
  }
[...]
有效

[...]
  body {
    addon( 'addon-warning', p('Lorem Ipsum'), p('Dolor sit amet consectetur') )
  }
[...]
[...]
  body {
    addon( 'addon-warning', '<p>Lorem Ipsum</p>', '<p>Dolor sit amet consectetur</p>') )
  }
[...]
[…]
身体{
插件('addon warning','Lorem Ipsum

,'Dolor sit amet Concertetur

)) } [...]

我尝试了一些变体,使用
yield
而不是
yieldUnescaped
,但没有成功。可能吗?任何帮助都将不胜感激。

假设您希望将更多基于DSL的标记传递到您的
插件
函数中,我会将闭包传递给该函数。这是一个简化的、自包含的版本(由于模板位于字符串中,因此阅读起来有点困难;请查看
XXX
注释):

导入groovy.text.markup*
def config=new TemplateConfiguration()
def engine=新标记模板引擎(配置)
def template=engine.createTemplate(“”)
html{
身体{
插件(“Hello World”,{//XXX:传递闭包
p(“Lorem Ipsum”)
p(“Lorem Ipsum”)
p(“Lorem Ipsum”)
})
}
}
无效加载项(标题、内容){
h1(标题)
div{
content()//XXX调用闭包
}
}
''')
可写输出=template.make([:])
println输出
//=>你好世界Lorem Ipsum

Lorem Ipsum


这有点令人困惑,因为您提到有些东西不起作用,有些东西起作用。因此,不清楚实际问题是什么。