【问题标题】:Groovy TemplateEngine - function for markup creationGroovy TemplateEngine - 用于创建标记的函数
【发布时间】:2017-11-27 17:30:46
【问题描述】:

我是一名 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>') )
  }
[...]

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

【问题讨论】:

  • 这有点令人困惑,因为您提到有些东西不起作用而有些东西起作用。所以,不清楚实际的问题是。

标签: groovy template-engine


【解决方案1】:

假设您想将更多基于 DSL 的标签传递给您的 addon 函数,我会改为将闭包传递给该函数。这是一个简化的、自包含的版本(这使得它有点难以阅读,因为模板是在一个字符串中;看看XXX cmets):

import groovy.text.markup.*

def config = new TemplateConfiguration()
def engine = new MarkupTemplateEngine(config)
def template = engine.createTemplate('''
html {
    body {
        addon("Hello World", { // XXX: pass a closure
            p("Lorem Ipsum")
            p("Lorem Ipsum")
            p("Lorem Ipsum")
        })
    }
}

void addon(title, content) {
    h1(title)
    div {
        content() // XXX call the closure
    }
}
''')
Writable output = template.make([:])
println output
// => <html><body><h1>Hello World</h1><div><p>Lorem Ipsum</p><p>Lorem Ipsum</p><p>Lorem Ipsum</p></div></body></html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多