943fe971 by astaxie

support template

1 parent 9d84969b
...@@ -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 {
45 if k == 0 {
46 f.WriteString(header)
47 } else if k == 1 {
48 f.WriteString(index)
49 } else if k == 2 {
50 f.WriteString(block)
51 }
52
24 f.Close() 53 f.Close()
25 } 54 }
26 } 55 }
27 if err := BuildTemplate(dir); err != nil { 56 if err := BuildTemplate(dir); err != nil {
28 t.Fatal(err) 57 t.Fatal(err)
29 } 58 }
30 if len(BeeTemplates) != 2 {
31 t.Fatalf("should be 2 but got %v", len(BeeTemplates))
32 }
33
34 AddTemplateExt("mystyle")
35 if err := BuildTemplate(dir); err != nil {
36 t.Fatal(err)
37 }
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 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!