基于官方 text/template
和 html/template
的模板引擎.
Template 通过几种惯用方式组合, 为模板提供简洁的使用方式.
- 模板名仿效 URI 格式, 使用全路径名称命名.
- 模板名以 ".html" 结尾当作 HTML 模板处理, 否则当作 TEXT 模板处理.
- 模板源码可使用相对路径名指示目标模板.
- 引入 RootDir 限制模板文件根目录.
- 内置 import 函数支持变量名表示模板名.
以源码 fixtures/base 目录下的文件为例:
\---base
| foot.html <script>"foot"</script>
| layout.html 单独列出
|
\---admin
body.html <h1><a href="{{.href}}">{{.name}}</a></h1>
js.tmpl <script>"admin"</script>
layout.html 内容, 注意 import 支持变量, 支持目标模板名采用相对路径:
<html>
<head>
<meta charset="UTF-8">
{{import .js}}
</head>
<body>
{{import .body .}}
</body>
{{template "foot.html"}}
</html>
GoLang 代码:
package main
import (
"github.com/achun/template"
"os"
)
var data = map[string]interface{}{
"title": `>title`,
"body": `/admin/body.html`,
"js": `/admin/js.tmpl`,
"href": ">>>",
"name": "admin",
}
func main() {
pwd, _ := os.Getwd()
t, err := template.New("./fixtures/base/layout.html")
t.Walk(pwd+`/fixtures/base`, ".html.tmpl")
t.Execute(os.Stdout, data)
}
输出:
<html>
<head>
<meta charset="UTF-8">
<script>"admin"</script>
</head>
<body>
<h1><a href="%3e%3e%3e">admin</a></h1>
</body>
<script>"foot"</script>
</html>
通过重写 *parse.Tree 中的 template
用 import
函数替换. 并且重新计算目标路径为绝对路径. 最终形成的 import
定义为:
func(from, name string, data ...interface{}) (template.HTML, error)
- from 为发起调用的模板名称, form 是自动计算出的, 使用者不能定义.
- name 为模板模板名称
- data 为用户数据
name 支持变量, 此变量有可能采用相对路径, form 为计算绝对路径提供了参照. 而 rootdir 保证所有的相对路径都可以计算出绝对路径.
template is licensed under the BSD