2013-07-06 10 views
5

Sto riscontrando un problema nel controllo degli spazi bianchi e nella formattazione dei modelli html/template in modo leggibile. I miei modelli sembrano somthing come questo:Come posso controllare gli spazi bianchi dopo un'azione in html/template?

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

codice

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", 
      }, 
     }, 
    }) 
} 

Ma che produce (nota: c'è una linea sopra il doctype):

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


2 items are made of angora 

3 items are made of wool 


    </body> 
</html> 

Quello che voglio è:

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

In altre lingue template posso dire le cose come

[[- value -]] 

e gli spazi prima e dopo l'azione sono spogliati, ma non vedo nulla come quello in html/template. Questo significa davvero che devo rendere illeggibili i miei template come il seguente?

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

risposta

1

Sì, gli spazi e le linee sono tradotti letteralmente. Se hai una linea con solo un {{define}} o qualsiasi altra cosa che non produce output, avrai una riga vuota nel file analizzato.

Idealmente, poiché si utilizza il modello, non è necessario visualizzare o modificare l'output analizzato. Per riferimento, usa JSP/JSF e guarda il brutto risultato che ti dà. Visualizza la fonte della maggior parte delle pagine online, sono anche brutte.

Buona fortuna!

2

Whitespace in questo caso non fa alcuna differenza nell'output reso sul browser dell'utente, quindi il controllo non ha molto senso sopra l'estetica.

In altre parole, si possono avere modelli ben formattati (che preferirei) o HTML formattati in modo particolare (senza rientri nidificati). Scegli uno o post processare l'HTML usando uno dei formattatori esistenti.

5

È possibile utilizzare il bianco controller di spazio

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

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

+0

sì, grazie @webwurst prima di 1.6, è possibile controllare https : //golang.org/pkg/text/template/#hdr-Text_and_spaces – hkulekci

+0

Funziona solo per 'text/template', non' html/template'. –