簡體   English   中英

從Groovy DSL內調用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM