2016-12-20 6 views
4

テンプレートで生成されたHTMLスニペットをエスケープするにはどうすればよいですか?この例のように:テンプレートの出力からどのようにエスケープできますか?

package main 

import (
    "fmt" 
    "html/template" 
    "os" 
) 

// I want to escape a html snippet which is then stored as a 
// javascript variable. how can I do that? the second output 
// is the one i would like to generate with a template. 

var tmpl = `{{define "main"}}<script>var xx = "{{template "html-snippet" .}}";</script>{{end}}{{define "html-snippet"}}<div> 
    <img src="{{.}}"> 
</div>{{end}}` 

func main() { 
    t, err := template.New("fo").Parse(tmpl) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    t.ExecuteTemplate(os.Stdout, "main", "some.jpg") 
    fmt.Println("") 
    fmt.Println(template.JSEscapeString(`<div> 
     <img src="some.jpg"> 
    </div`)) 
} 

https://play.golang.org/p/TBJxYqokkU

html/templateは、私の場合には、自動的にそれをしていません。 JSEscapeStringのfuncマップは、これが文字列ではないので、{{jsescape (template "html-snippet" .)}}のように呼び出すことができないため、動作しません(または私にはわかりません)。

感謝

答えて

1

あなたはインクルードテンプレートを実行し、stringとして結果を返す関数を登録することもできます。それstringは、他のテンプレートに挿入することができ、適切な文脈依存が自動的に適用エスケープ:

var tmpl = `{{define "main"}}<script>var xx = {{exect "html-snippet" .}};</script>{{end}}{{define "html-snippet"}}<div> 
    <img src="{{.}}"> 
</div>{{end}}` 

var t *template.Template 

func exect(name string, data interface{}) string { 
    buf := &bytes.Buffer{} 
    if err := t.ExecuteTemplate(buf, name, data); err != nil { 
     fmt.Println("Error:", err) 
    } 
    return buf.String() 
} 

func main() { 
    t = template.Must(template.New("fo").Funcs(template.FuncMap{ 
     "exect": exect, 
    }).Parse(tmpl)) 
    if err := t.ExecuteTemplate(os.Stdout, "main", "some.jpg"); err != nil { 
     fmt.Println(err) 
    } 
} 

出力(Go Playground上でそれを試してみてください):

<script>var xx = "\u003cdiv\u003e\n\t\u003cimg src=\"some.jpg\"\u003e\n\u003c/div\u003e";</script> 

あるいはさらに良い:テンプレートエンジンが可能に2つの値(2番目はエラーでなければならない)を返す関数を登録するため、exect()関数は次のようになります。

func exect(name string, data interface{}) (string, error) { 
    buf := &bytes.Buffer{} 
    err := t.ExecuteTemplate(buf, name, data) 
    return buf.String(), err 
} 

出力は同じです。 Go Playgroundでこれを試してください。

関連する問題