11package dotweb
22
33import (
4+ "errors"
5+ "github.com/devfeel/dotweb/framework/file"
46 "html/template"
57 "io"
68 "io/ioutil"
@@ -9,33 +11,71 @@ import (
911
1012//Renderer is the interface that wraps the render method.
1113type Renderer interface {
14+ //set default template path, support multi path
15+ //模板查找顺序从最后一个插入的元素开始往前找
16+ //默认添加base、base/templates、base/views
17+ SetTemplatePath (path ... string )
1218 Render (io.Writer , string , interface {}, * HttpContext ) error
1319}
1420
1521type innerRenderer struct {
22+ templatePaths []string
1623}
1724
1825// Render render view use http/template
1926func (r * innerRenderer ) Render (w io.Writer , tpl string , data interface {}, ctx * HttpContext ) error {
20- t , err := parseFile (tpl )
27+ t , err := r . parseFile (tpl )
2128 if err != nil {
2229 return err
2330 }
2431 return t .Execute (w , data )
2532}
2633
34+ //set default template paths, support multi path
35+ //模板查找顺序从最后一个插入的元素开始往前找
36+ //默认添加base、base/templates、base/views
37+ func (r * innerRenderer ) SetTemplatePath (path ... string ) {
38+ r .templatePaths = append (r .templatePaths , path ... )
39+ }
40+
2741// 定义函数unescaped
2842func unescaped (x string ) interface {} { return template .HTML (x ) }
2943
3044// return http/template by gived file name
31- func parseFile (filename string ) (* template.Template , error ) {
45+ func ( r * innerRenderer ) parseFile (filename string ) (* template.Template , error ) {
3246 var t * template.Template
33- b , err := ioutil .ReadFile (filename )
47+ findlog := filename
48+ realTempFile := filename
49+ isExist := false
50+ //多级检查
51+ if ! file .Exist (filename ) {
52+ tmpFileName := filename
53+ for i := len (r .templatePaths ) - 1 ; i >= 0 ; i -- {
54+ if r .templatePaths [i ] == "" {
55+ break
56+ }
57+ tmpFileName = r .templatePaths [i ] + "/" + filename
58+ findlog += "\r \n " + tmpFileName
59+ if file .Exist (tmpFileName ) {
60+ realTempFile = tmpFileName
61+ isExist = true
62+ break
63+ }
64+ }
65+ } else {
66+ isExist = true
67+ }
68+
69+ if ! isExist {
70+ return nil , errors .New ("not found template file=>\r \n " + findlog )
71+ }
72+
73+ b , err := ioutil .ReadFile (realTempFile )
3474 if err != nil {
3575 return nil , err
3676 }
3777 s := string (b )
38- name := filepath .Base (filename )
78+ name := filepath .Base (realTempFile )
3979 t = template .New (name )
4080 t = registeTemplateFunc (t )
4181 _ , err = t .Parse (s )
@@ -54,5 +94,11 @@ func registeTemplateFunc(t *template.Template) *template.Template {
5494// NewInnerRenderer create a inner renderer instance
5595func NewInnerRenderer () * innerRenderer {
5696 r := new (innerRenderer )
97+ r .templatePaths = make ([]string , 3 )
98+ //添加基础路径
99+ //base、base/templates、base/views
100+ r .templatePaths = append (r .templatePaths , file .GetCurrentDirectory ())
101+ r .templatePaths = append (r .templatePaths , file .GetCurrentDirectory ()+ "/templates" )
102+ r .templatePaths = append (r .templatePaths , file .GetCurrentDirectory ()+ "/views" )
57103 return r
58104}
0 commit comments