2010-03-20 3 views
3

Sur le Groovy example page il est un exemple de la façon d'utiliser le constructeur Groovy HTML avec un contenu mixte:Quelle est la syntaxe correcte pour utiliser HTML Builder avec un contenu mixte dans Groovy 1.7?

p [ 
     "This is some", 
     b"mixed", 
     "text. For more see the", 
     ahref:'http://groovy.codehaus.org' ["Groovy"], 
     "project" 
    ] 

Ceci est cependant ne fonctionne pas pour moi, je reçois un message d'erreur comme:

expecting ']', found 'mixed' @ line 33, column 23. b"mixed",^1 error 

Le La page d'exemple Groovy indique que:

[Remarque: la syntaxe de certains de ces exemples est légèrement obsolète. Voir chapitre 8 de GINA dans le temps moyen jusqu'à ce que ces exemples sont mis à jour.]

Je soupçonne donc que la syntaxe du constructeur HTML a changé, mais je n'ai pas le livre je ne peux pas vérifiez et je n'arrive pas à trouver un exemple pertinent de ce travail en ligne. Est-ce que quelqu'un sait comment la syntaxe est supposée être dans Groovy 1.7 et que cela fonctionne?

Répondre

7

J'ai trouvé beaucoup de choses dans cet exemple à être démodé. La syntaxe pour les hrefs mixtes et le [] autour du paragraphe ne fonctionne pas pour moi.

Pour un contenu mixte, vous devez utiliser le mot clé spécial 'mkp.yield'. Il y a aussi un 'mkp.yieldUnescaped' si vous ne voulez pas vous échapper. Il y a aussi d'autres fonctions que vous pouvez faire avec mkp.

Cet exemple fonctionne et montre l'utilisation du contenu mixte:

def builder = new groovy.xml.MarkupBuilder() 
builder.html {  
    head {   
    title"XML encoding with Groovy"  
    }  
    body { 
    h1"XML encoding with Groovy" 
    p"this format can be used as an alternative markup to XML"  

    a(href:'http://groovy.codehaus.org', "Groovy") 

    p {  
     mkp.yield "This is some" 
     b"mixed" 
     mkp.yield " text. For more see the" 
     a(href:'http://groovy.codehaus.org', "Groovy") 
     mkp.yield "project"  
    }  
    p "some text"  
    } 
}​ 

Sortie:

<html> 
    <head> 
    <title>XML encoding with Groovy</title> 
    </head> 
    <body> 
    <h1>XML encoding with Groovy</h1> 
    <p>this format can be used as an alternative markup to XML</p> 
    <a href='http://groovy.codehaus.org'>Groovy</a> 
    <p>This is some 
     <b>mixed</b> text. For more see the 
     <a href='http://groovy.codehaus.org'>Groovy</a>project 
    </p> 
    <p>some text</p> 
    </body> 
</html> 
+0

Merci beaucoup pour cette réponse très complète! Je n'ai pas encore eu l'occasion de l'essayer, mais je suppose que cela fonctionnera. Cette syntaxe "rendement" semble un peu unelegant et crufty si :( – stian

1

Je pense que cela fonctionne mieux: -

def writer = new StringWriter() 
    def builder = new groovy.xml.MarkupBuilder(writer) 
    builder.html { 
     head { 
      title"Report" 
     } 
     body { 
      h1"XML encoding with Groovy" 
      p"this format can be used as an alternative markup to XML" 

      // an element with attributes and text content/
      a(href:'http://groovy.codehaus.org', "Groovy") 

      // mixed content/
      p() { 
       "This is some" 
       "mixed" 
       "text. For more see the" 
       a(href:'http://groovy.codehaus.org', "Groovy") 
       "project" 
      } 
      p "some text" 
     } 
    } 

Le résultat est: -

<html> 
    <head> 
    <title>Report</title> 
    </head> 
    <body> 
    <h1>XML encoding with Groovy</h1> 
    <p>this format can be used as an alternative markup to XML</p> 
    <a href='http://groovy.codehaus.org'>Groovy</a> 
    <p> 
     <a href='http://groovy.codehaus.org'>Groovy</a> 
    </p> 
    <p>some text</p> 
    </body> 
</html> 
1

Ce

p() { 
    "This is some" 
    "mixed" 
    "text. For more see the" 
    a(href:'http://groovy.codehaus.org', "Groovy") 
    "project" 
} 

ne fait pas ce que vous voulez. La fermeture est exécutée, mais les chaînes elles-mêmes lorsqu'elles sont exécutées sont simplement évaluées et c'est tout. Elles ne vont nulle part. D'un autre côté, 'a' est un appel de méthode qui est évalué dans le contexte du noeud 'p' nouvellement créé.

Questions connexes