2016-07-19 7 views
0

Ich habe eine einfache Methode, den Groovy Groovy MarkupBuilder verwendet HTML zu drucken, sehr vereinfachte Version unter:Aufruf der Methode aus einem starken DSL

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

Diese gut funktioniert. Angenommen, ich möchte eine Methode nach der h1 aufrufen, die einige Berechnungen durchführt und dem MarkupBuilder mehr hinzufügt. Wie bekomme ich die Elemente, die in der aufgerufenen Methode zum MarkupBuilder definiert sind? Hier ist etwas, was ich versuchte, dass eine Ausnahme nicht verursacht, aber auch nicht funktioniert (die resultierende HTML hat kein <h2> Element):

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

Ich weiß, dass ich einfach diese Inline tun kann. Ich versuche mein Verständnis dafür zu vertiefen, wie Groovy Schließungen und Delegierte in DSLs verwendet und mir eindeutig etwas fehlt.

Antwort

1

Betrachten Sie den folgenden Code, der für mich funktioniert, mit Groovy 2.4.5.

Das Builder-Muster ist ein bisschen schwierig, da es abhängig von Ihrer Perspektive als hierarchische Daten und/oder Code angesehen werden kann. Mit etwas Übung kann man bei Bedarf die Perspektive wechseln.

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") 
Verwandte Themen