Sembra si potrebbe correre template.HTMLEscape() sul tuo primo testo per igienizzare, quindi effettuare il \ n alla sostituzione
di cui ci si fida, quindi utilizzarla come dati del modello pre-escape e attendibili.
Aggiornamento: Ampliando l'esempio di Kocka, questo è quello che avevo in mente:
package main
import (
"html/template"
"os"
"strings"
)
const page = `<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>{{.}}</p>
</body>
</html>`
const text = `first line
<script>dangerous</script>
last line`
func main() {
t := template.Must(template.New("page").Parse(page))
safe := template.HTMLEscapeString(text)
safe = strings.Replace(safe, "\n", "<br>", -1)
t.Execute(os.Stdout, template.HTML(safe)) // template.HTML encapsulates a known safe HTML document fragment.
}
http://play.golang.org/p/JiH0uD5Zh2
uscita è
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>first line<br><script>dangerous</script><br>last line</p>
</body>
</html>
e il testo reso nel browser è
first line
<script>dangerous</script>
last line
non posso gettarlo ai 'template.HTML' perché la mia stringa non è sicuro. Potresti elaborare il trucco del pileline? Grazie mille –
se la stringa non è sicura, la pipeline non aiuterà neanche. Prova a dividere la stringa su '" \ n "' e passando la sezione risultante nel modello. Utilizzare 'range' per stampare la stringa e inserire'
'. Ad esempio: 'Arr: = strings.Split (myString," \ n ")' nel codice go e '{{range Arr}} {{.}}
{{end}}' nel modello. – dskinner
@dskinner, so che è tardi, ma dovresti scrivere il tuo come risposta completa. È una soluzione molto più pulita. – Nashenas