html/template

html/template

html/templatetext/template.tpl.htmljadeacehtml/templatehtml/templatehtml/template
package main
import (
    "html/template"
)
type User struct {
    Name string
}
func main() {
    t := template.New("template example")
    t, _ = t.Parse("hello {{.Name}}!")
    p := User{Name: "jjz"}
    t.Execute(os.Stdout, p)
}

hello jjzParse()Execute(){{}}{{. Name}}Beegoviewstemplate.Templatebeego.AddTemplateEngine

AddTemplateEngine

beego.AddTemplateEnginetemplate.Templateviewstemplate.Templatetemplate.Template

jade.go

jade.go

go get github.com/Joker/jade

jade.go
func main() {
    tpl, err := jade.Parse("name_of_tpl", "doctype 5: html: body: p Hello world!")
    if err != nil {
        return
    }
    fmt.Printf( "%s", tpl  )
}

输出字符串:

<!DOCTYPE html>
<html>
    <body>
        <p>Hello world!</p>
    </body>
</html>
jade.gojade.go
func addJadeTemplate() {
    beego.AddTemplateEngine("jade", func(root, path string, funcs template.FuncMap) (*template.Template, error) {
        jadePath := filepath.Join(root, path)
        content, err := utils.ReadFile(jadePath)
        fmt.Println(content)
        if err != nil {
            return nil, fmt.Errorf("error loading jade template: %v", err)
        }
        tpl, err := jade.Parse("name_of_tpl", content)
        if err != nil {
            return nil, fmt.Errorf("error loading jade template: %v", err)
        }
        fmt.Println("html:\n%s",tpl)
        tmp := template.New("Person template")
        tmp, err = tmp.Parse(tpl)
        if err != nil {
            return nil, fmt.Errorf("error loading jade template: %v", err)
        }
        fmt.Println(tmp)
        return tmp, err

    })
}
jade.go
func ReadFile(path string) (str string, err error) {
    fi, err := os.Open(path)
    defer fi.Close()
    fd, err := ioutil.ReadAll(fi)
    str = string(fd)
    return
}
template.TemplateTemplate.Parse()main()Beego

jade模板的使用

home.jade
doctype html
html
  head
    title pageTitle
  body
    h1 jade
    .content {{.content}}
{{.content}}Controller

func (c *MainController) Jade() {
    c.Data["content"] = "this is jade template"
    c.TplName = "home.jade"
}

运行之后生成的页面代码:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>pageTitle</title>
    </head>
    <body>
        <h1>jade</h1>
        <div class="content">this is jade template</div>  
    </body>
</html>

通过添加一个解析模板的引擎就可以在beego中使用jade的模板,beego从1.7.0之后开始支持复杂的模板引擎,不仅仅是对于jade的支持,也包括对于其他模板引擎的支持。
除了jade之外,在这个PR中推荐使用的是aceHTML模板引擎。

ace

ace模板Jadeace

go get github.com/yosssi/ace

在main函数中添加ace模板解析引擎:

func addAceTemplate()  {
    beego.AddTemplateEngine("ace", func(root, path string, funcs template.FuncMap) (*template.Template, error) {
        aceOptions := &ace.Options{DynamicReload: true, FuncMap: funcs}
        aceBasePath := filepath.Join(root, "base")
        aceInnerPath := filepath.Join(root, strings.TrimSuffix(path, ".ace"))
        tpl, err := ace.Load(aceBasePath, aceInnerPath, aceOptions)
        if err != nil {
            return nil, fmt.Errorf("error loading ace template: %v", err)
        }
        return tpl, nil
    })  
}

base.aceace.Load()template.Templatehome.ace
= doctype html
html lang=en
  head
    meta charset=utf-8
    title Base and Inner Template
  body
    h1 ace
    .content {{.content}}

controller
func (c *MainController)Ace() {
    c.Data["content"] = "this is ace template"
    c.TplName = "home.ace"
}