support template
Showing
2 changed files
with
62 additions
and
25 deletions
| ... | @@ -65,17 +65,11 @@ func (self *templatefile) visit(paths string, f os.FileInfo, err error) error { | ... | @@ -65,17 +65,11 @@ func (self *templatefile) visit(paths string, f os.FileInfo, err error) error { |
| 65 | a = a[len([]byte(self.root)):] | 65 | a = a[len([]byte(self.root)):] |
| 66 | file := strings.TrimLeft(replace.Replace(string(a)), "/") | 66 | file := strings.TrimLeft(replace.Replace(string(a)), "/") |
| 67 | subdir := filepath.Dir(file) | 67 | subdir := filepath.Dir(file) |
| 68 | t, err := getTemplate(self.root, file) | ||
| 69 | if err != nil { | ||
| 70 | Trace("parse template err:", file, err) | ||
| 71 | } else { | ||
| 72 | BeeTemplates[file] = t | ||
| 73 | } | ||
| 74 | if _, ok := self.files[subdir]; ok { | 68 | if _, ok := self.files[subdir]; ok { |
| 75 | self.files[subdir] = append(self.files[subdir], paths) | 69 | self.files[subdir] = append(self.files[subdir], file) |
| 76 | } else { | 70 | } else { |
| 77 | m := make([]string, 1) | 71 | m := make([]string, 1) |
| 78 | m[0] = paths | 72 | m[0] = file |
| 79 | self.files[subdir] = m | 73 | self.files[subdir] = m |
| 80 | } | 74 | } |
| 81 | 75 | ||
| ... | @@ -119,6 +113,16 @@ func BuildTemplate(dir string) error { | ... | @@ -119,6 +113,16 @@ func BuildTemplate(dir string) error { |
| 119 | fmt.Printf("filepath.Walk() returned %v\n", err) | 113 | fmt.Printf("filepath.Walk() returned %v\n", err) |
| 120 | return err | 114 | return err |
| 121 | } | 115 | } |
| 116 | for _, v := range self.files { | ||
| 117 | for _, file := range v { | ||
| 118 | t, err := getTemplate(self.root, file, v...) | ||
| 119 | if err != nil { | ||
| 120 | Trace("parse template err:", file, err) | ||
| 121 | } else { | ||
| 122 | BeeTemplates[file] = t | ||
| 123 | } | ||
| 124 | } | ||
| 125 | } | ||
| 122 | return nil | 126 | return nil |
| 123 | } | 127 | } |
| 124 | 128 | ||
| ... | @@ -152,9 +156,18 @@ func getTplDeep(root, file string, t *template.Template) (*template.Template, er | ... | @@ -152,9 +156,18 @@ func getTplDeep(root, file string, t *template.Template) (*template.Template, er |
| 152 | return t, nil | 156 | return t, nil |
| 153 | } | 157 | } |
| 154 | 158 | ||
| 155 | func getTemplate(root, file string) (t *template.Template, err error) { | 159 | func getTemplate(root, file string, others ...string) (t *template.Template, err error) { |
| 156 | t = template.New(file).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap) | 160 | t = template.New(file).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap) |
| 157 | t, err = getTplDeep(root, file, t) | 161 | t, err = getTplDeep(root, file, t) |
| 162 | for _, otherfile := range others { | ||
| 163 | if temp := t.Lookup(otherfile); temp != nil { | ||
| 164 | continue | ||
| 165 | } | ||
| 166 | t, err = getTplDeep(root, otherfile, t) | ||
| 167 | if err != nil { | ||
| 168 | break | ||
| 169 | } | ||
| 170 | } | ||
| 158 | if err != nil { | 171 | if err != nil { |
| 159 | return nil, err | 172 | return nil, err |
| 160 | } | 173 | } | ... | ... |
| ... | @@ -6,40 +6,64 @@ import ( | ... | @@ -6,40 +6,64 @@ import ( |
| 6 | "testing" | 6 | "testing" |
| 7 | ) | 7 | ) |
| 8 | 8 | ||
| 9 | func TestBuildTemplate(t *testing.T) { | 9 | var header string = `{{define "header"}} |
| 10 | <h1>Hello, astaxie!</h1> | ||
| 11 | {{end}}` | ||
| 12 | |||
| 13 | var index string = `<!DOCTYPE html> | ||
| 14 | <html> | ||
| 15 | <head> | ||
| 16 | <title>beego welcome template</title> | ||
| 17 | </head> | ||
| 18 | <body> | ||
| 19 | {{template "block"}} | ||
| 20 | {{template "header"}} | ||
| 21 | {{template "blocks/block.tpl"}} | ||
| 22 | </body> | ||
| 23 | </html> | ||
| 24 | ` | ||
| 25 | |||
| 26 | var block string = `{{define "block"}} | ||
| 27 | <h1>Hello, blocks!</h1> | ||
| 28 | {{end}}` | ||
| 29 | |||
| 30 | func TestTemplate(t *testing.T) { | ||
| 10 | dir := "_beeTmp" | 31 | dir := "_beeTmp" |
| 11 | files := []string{ | 32 | files := []string{ |
| 12 | "1.tpl", | 33 | "header.tpl", |
| 13 | "2.html", | 34 | "index.tpl", |
| 14 | "3.htmltpl", | 35 | "blocks/block.tpl", |
| 15 | "4.mystyle", | ||
| 16 | } | 36 | } |
| 17 | if err := os.MkdirAll(dir, 0777); err != nil { | 37 | if err := os.MkdirAll(dir, 0777); err != nil { |
| 18 | t.Fatal(err) | 38 | t.Fatal(err) |
| 19 | } | 39 | } |
| 20 | for _, name := range files { | 40 | for k, name := range files { |
| 41 | os.MkdirAll(filepath.Dir(filepath.Join(dir, name)), 0777) | ||
| 21 | if f, err := os.Create(filepath.Join(dir, name)); err != nil { | 42 | if f, err := os.Create(filepath.Join(dir, name)); err != nil { |
| 22 | t.Fatal(err) | 43 | t.Fatal(err) |
| 23 | } else { | 44 | } else { |
| 24 | f.Close() | 45 | if k == 0 { |
| 25 | } | 46 | f.WriteString(header) |
| 47 | } else if k == 1 { | ||
| 48 | f.WriteString(index) | ||
| 49 | } else if k == 2 { | ||
| 50 | f.WriteString(block) | ||
| 26 | } | 51 | } |
| 27 | if err := BuildTemplate(dir); err != nil { | 52 | |
| 28 | t.Fatal(err) | 53 | f.Close() |
| 29 | } | 54 | } |
| 30 | if len(BeeTemplates) != 2 { | ||
| 31 | t.Fatalf("should be 2 but got %v", len(BeeTemplates)) | ||
| 32 | } | 55 | } |
| 33 | |||
| 34 | AddTemplateExt("mystyle") | ||
| 35 | if err := BuildTemplate(dir); err != nil { | 56 | if err := BuildTemplate(dir); err != nil { |
| 36 | t.Fatal(err) | 57 | t.Fatal(err) |
| 37 | } | 58 | } |
| 38 | if len(BeeTemplates) != 3 { | 59 | if len(BeeTemplates) != 3 { |
| 39 | t.Fatalf("should be 3 but got %v", len(BeeTemplates)) | 60 | t.Fatalf("should be 3 but got %v", len(BeeTemplates)) |
| 40 | } | 61 | } |
| 62 | if err := BeeTemplates["index.tpl"].ExecuteTemplate(os.Stdout, "index.tpl", nil); err != nil { | ||
| 63 | t.Fatal(err) | ||
| 64 | } | ||
| 41 | for _, name := range files { | 65 | for _, name := range files { |
| 42 | os.Remove(filepath.Join(dir, name)) | 66 | os.RemoveAll(filepath.Join(dir, name)) |
| 43 | } | 67 | } |
| 44 | os.Remove(dir) | 68 | os.RemoveAll(dir) |
| 45 | } | 69 | } | ... | ... |
-
Please register or sign in to post a comment