如何在Go中直接包含SVG作为html部分

时间:2016-11-16 13:41:50

标签: svg go

我想将svg文件包含为html部分,因此我可以在HTML中使用它内联。 我现在把我的svg包装在html文件中并包含它们:

{{ template "/partial/my-svg.html" }}

但我想直接包括我的svg。 PHP就是这样做的:

<?php echo file_get_contents("/partial/my-svg.svg"); ?> 

我认为go有类似的东西吗?所以我认为我需要使用自定义函数扩展模板逻辑。类似的东西:

{{ includeSvg "/partial/my-svg.svg" }}

这样的功能在go中会是什么样子?

1 个答案:

答案 0 :(得分:1)

以下是如何添加模板函数并在模板中按路径包含svg的工作示例

package main

import (
    "html/template"
    "io/ioutil"
    "log"
    "net/http"
)

func IncludeHTML(path string) template.HTML {
    b, err := ioutil.ReadFile(path)
    if err != nil {
        log.Println("includeHTML - error reading file: %v", err)
        return ""
    }

    return template.HTML(string(b))
}

func main() {
    tmpl := template.New("sample")
    tmpl.Funcs(template.FuncMap{
        "IncludeHTML": IncludeHTML,
    })

    tmpl, err := tmpl.Parse(`
<!DOCTYPE>
<html>
<body>
    <h1>Check out this svg</h1>
    {{ IncludeHTML "/path/to/svg" }}
</body>
</html>
    `)
    if err != nil {
        log.Fatal(err)
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/html")
        if err := tmpl.Execute(w, nil); err != nil {
            log.Println("Error executing template: %v", err)
        }
    })

    if err := http.ListenAndServe(":8000", nil); err != nil {
        log.Fatal(err)
    }
}