2013-07-06 12 views
5

Ich habe ein Problem, Whitespace und Formatierung html/template Vorlagen in einer lesbaren Weise zu steuern. Meine Vorlagen somthing wie folgt aussehen:Wie kann ich Whitespace nach einer Aktion in HTML/Vorlage steuern?

layout.tmpl

{{define "layout"}} 
<!DOCTYPE html> 
<html> 
     <head> 
       <title>{{.title}}</title> 
     </head> 
     <body> 
       {{ template "body" . }} 
     </body> 
</html> 
{{end}} 

body.tmpl

{{define "body"}} 
{{ range .items }} 
{{.count}} items are made of {{.material}} 
{{end}} 
{{end}} 

Code

package main 

import (
    "os" 
    "text/template" 
) 

type View struct { 
    layout string 
    body string 
} 

type Smap map[string]string 

func (self View) Render(data map[string]interface{}) { 
    layout := self.layout + ".tmpl" 
    body := self.body + ".tmpl" 
    tmpl := template.Must(template.New("layout").ParseFiles(layout, body)) 
    tmpl.ExecuteTemplate(os.Stdout, "layout", data) 
} 

func main() { 
    view := View{ "layout", "body" } 
    view.Render(map[string]interface{}{ 
     "title": "stock", 
     "items": []Smap{ 
      Smap{ 
       "count": "2", 
       "material": "angora", 
      }, 
      Smap{ 
       "count": "3", 
       "material": "wool", 
      }, 
     }, 
    }) 
} 

Aber das erzeugt (Anmerkung: Es gibt eine Zeile oben der Doctype):

<!DOCTYPE html> 
<html> 
    <head> 
     <title>stock</title> 
    </head> 
    <body> 


2 items are made of angora 

3 items are made of wool 


    </body> 
</html> 

Was ich will, ist:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>stock</title> 
    </head> 
    <body> 
2 items are made of angora 
3 items are made of wool 
    </body> 
</html> 

In anderer Template-Sprache kann ich sagen Dinge wie

[[- value -]] 

und die Leerzeichen vor und nach der Aktion abgezogen werden, aber ich sehe nichts so in html/template. Bedeutet das wirklich, dass ich meine Vorlagen wie folgt unlesbar machen muss?

layout.tmpl

{{define "layout"}}<!DOCTYPE html> 
<html> 
    <head> 
     <title>.title</title> 
    </head> 
    <body> 
{{ template "body" . }} </body> 
</html> 
{{end}} 

body.tmpl

{{define "body"}}{{ range .items }}{{.count}} items are made of {{.material}} 
{{end}}{{end}} 

Antwort

1

Ja, Leerzeichen und Zeilen wörtlich übersetzt werden. Wenn Sie eine Zeile mit nur {{define}} oder etwas anderem haben, das keine Ausgabe erzeugt, haben Sie eine leere Zeile in der geparsten Datei.

Im Idealfall sollten Sie die analysierte Ausgabe nicht anzeigen oder bearbeiten müssen, da Sie eine Vorlage verwenden. Als Referenz verwenden Sie JSP/JSF und sehen Sie die hässliche Ausgabe, die es Ihnen gibt. Sehen Sie sich die Quelle der meisten Seiten online an, sie sind auch hässlich.

Viel Glück!

2

Whitespace in diesem Fall macht keinen Unterschied in der gerenderten Ausgabe im Browser des Benutzers, so macht die Kontrolle darüber wenig Sinn vielleicht Ästhetik.

Anders gesagt, kann man schön formatierte Vorlagen haben (was ich lieber hätte) oder teilweise schön formatiert HTML (keine verschachtelten Einzüge). Wählen Sie einen oder posten Sie den HTML-Code mit einem der vorhandenen Formatierer.

5

können Sie weiß verwenden Raum Controller

{{range .foos -}} // eats trailing whitespace 
    <tr><td>do something</td></tr> 
{{- end}} // eats leading whitespace (\n from previous line) 
+0

Seit Go '1.6' https://golang.org/doc/go1.6#template – webwurst

+0

ja, danke @webwurst vor 1.6 können Sie https überprüfen : //golang.org/pkg/text/template/#hdr-Text_and_spaces – hkulekci

+0

Dies funktioniert nur für 'text/template', nicht' html/template'. –