[英]Calling method from within a Groovy DSL
我有一個簡單的Groovy方法,該方法使用Groovy的MarkupBuilder來打印HTML,下面是非常簡化的版本:
void writeHtmlFile(<args>) {
def writer = new FileWriter(fileName.toFile())
def html = new MarkupBuilder(writer)
html.mkp.yieldUnescaped '<!DOCTYPE html>'
html.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
html.html {
head { ... }
body(id: 'main') {
h1 "Report Title"
}
}
writer.flush()
writer.close()
}
這很好。 假設我想在h1
之后調用一個方法,該方法進行一些計算並將更多內容添加到MarkupBuilder中。 如何將在調用的方法中定義的元素添加到MarkupBuilder? 這是我嘗試過的不會引起異常但也不起作用的結果(結果HTML沒有<h2>
元素):
Closure testNested() {
println '---'
return { h2 "here's a subheading" }
}
// .... other stuff from above example not repeated ...
html.html {
head {...}
body(id: 'main') {
h1 "Report Title"
testNested()
}
我知道我可以輕松地進行內聯。 我試圖加深對Groovy如何在DSL中使用閉包和委托的理解,顯然我丟失了一些東西。
考慮下面的代碼,使用Groovy 2.4.5對我來說很好執行。
構建器模式有些棘手,因為根據您的觀點,可以將其視為分層數據和/或代碼。 通過實踐,可以根據需要切換視角。
import groovy.xml.*
void testNested(def html) {
html.h2("here's a subheading from testNested")
}
void writeHtmlFile(def fileName) {
def writer = new FileWriter(fileName)
def html = new MarkupBuilder(writer)
html.mkp.yieldUnescaped '<!DOCTYPE html>'
html.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
html.html {
body(id: 'main') {
h1 "Report Title"
testNested(html)
}
}
writer.flush()
writer.close()
}
writeHtmlFile("out.html")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.