README.md 2.96 KB

Multitemplate

Build Status codecov Go Report Card GoDoc

This is a custom HTML render to support multi templates, ie. more than one *template.Template.

Usage

Start using it

Download and install it:

$ go get github.com/gin-contrib/multitemplate

Import it in your code:

import "github.com/gin-contrib/multitemplate"

Simple example

See example/simple/example.go

package main

import (
    "github.com/gin-contrib/multitemplate"
    "github.com/gin-gonic/gin"
)

func createMyRender() multitemplate.Renderer {
    r := multitemplate.NewRenderer()
    r.AddFromFiles("index", "templates/base.html", "templates/index.html")
    r.AddFromFiles("article", "templates/base.html", "templates/index.html", "templates/article.html")
    return r
}

func main() {
    router := gin.Default()
    router.HTMLRender = createMyRender()
    router.GET("/", func(c *gin.Context) {
        c.HTML(200, "index", gin.H{
            "title": "Html5 Template Engine",
        })
    })
    router.GET("/article", func(c *gin.Context) {
        c.HTML(200, "article", gin.H{
            "title": "Html5 Article Engine",
        })
    })
    router.Run(":8080")
}

Advanced example

Approximating html/template Inheritance

See example/advanced/example.go

package main

import (
    "path/filepath"

    "github.com/gin-contrib/multitemplate"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.HTMLRender = loadTemplates("./templates")
    router.GET("/", func(c *gin.Context) {
        c.HTML(200, "index.html", gin.H{
            "title": "Welcome!",
        })
    })
    router.GET("/article", func(c *gin.Context) {
        c.HTML(200, "article.html", gin.H{
            "title": "Html5 Article Engine",
        })
    })

    router.Run(":8080")
}

func loadTemplates(templatesDir string) multitemplate.Renderer {
    r := multitemplate.NewRenderer()

    layouts, err := filepath.Glob(templatesDir + "/layouts/*.html")
    if err != nil {
        panic(err.Error())
    }

    includes, err := filepath.Glob(templatesDir + "/includes/*.html")
    if err != nil {
        panic(err.Error())
    }

    // Generate our templates map from our layouts/ and includes/ directories
    for _, include := range includes {
        layoutCopy := make([]string, len(layouts))
        copy(layoutCopy, layouts)
        files := append(layoutCopy, include)
        r.AddFromFiles(filepath.Base(include), files...)
    }
    return r
}