f502f844 by astaxie

fix #189

1 parent e788fb72
...@@ -17,6 +17,7 @@ import ( ...@@ -17,6 +17,7 @@ import (
17 "net/url" 17 "net/url"
18 "os" 18 "os"
19 "path" 19 "path"
20 "regexp"
20 "strconv" 21 "strconv"
21 "strings" 22 "strings"
22 "time" 23 "time"
...@@ -133,14 +134,52 @@ func (c *Controller) RenderBytes() ([]byte, error) { ...@@ -133,14 +134,52 @@ func (c *Controller) RenderBytes() ([]byte, error) {
133 panic("can't find templatefile in the path:" + c.TplNames) 134 panic("can't find templatefile in the path:" + c.TplNames)
134 return []byte{}, errors.New("can't find templatefile in the path:" + c.TplNames) 135 return []byte{}, errors.New("can't find templatefile in the path:" + c.TplNames)
135 } 136 }
136 BeeTemplates[subdir].ExecuteTemplate(newbytes, file, c.Data) 137 err := BeeTemplates[subdir].ExecuteTemplate(newbytes, file, c.Data)
138 if err != nil {
139 LayoutTplErrDeal:
140 if terr, ok := err.(*template.Error); ok {
141 if terr.ErrorCode == template.ErrNoSuchTemplate {
142 reg := regexp.MustCompile("\"(.+)\"")
143 a := reg.FindStringSubmatch(terr.Description)
144 if len(a) > 1 {
145 missfile := path.Join(ViewsPath, subdir, a[1])
146 AllTemplateFiles.files[subdir] = append(AllTemplateFiles.files[subdir], missfile)
147 for k, v := range AllTemplateFiles.files {
148 BeeTemplates[k] = template.Must(template.New("beegoTemplate"+k).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap).ParseFiles(v...))
149 }
150 err = BeeTemplates[subdir].ExecuteTemplate(newbytes, file, c.Data)
151 if err != nil {
152 goto LayoutTplErrDeal
153 }
154 }
155 }
156 }
157 }
137 tplcontent, _ := ioutil.ReadAll(newbytes) 158 tplcontent, _ := ioutil.ReadAll(newbytes)
138 c.Data["LayoutContent"] = template.HTML(string(tplcontent)) 159 c.Data["LayoutContent"] = template.HTML(string(tplcontent))
139 subdir = path.Dir(c.Layout) 160 subdir = path.Dir(c.Layout)
140 _, file = path.Split(c.Layout) 161 _, file = path.Split(c.Layout)
141 ibytes := bytes.NewBufferString("") 162 ibytes := bytes.NewBufferString("")
142 err := BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data) 163 err = BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data)
143 if err != nil { 164 if err != nil {
165 LayoutErrDeal:
166 if terr, ok := err.(*template.Error); ok {
167 if terr.ErrorCode == template.ErrNoSuchTemplate {
168 reg := regexp.MustCompile("\"(.+)\"")
169 a := reg.FindStringSubmatch(terr.Description)
170 if len(a) > 1 {
171 missfile := path.Join(ViewsPath, subdir, a[1])
172 AllTemplateFiles.files[subdir] = append(AllTemplateFiles.files[subdir], missfile)
173 for k, v := range AllTemplateFiles.files {
174 BeeTemplates[k] = template.Must(template.New("beegoTemplate"+k).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap).ParseFiles(v...))
175 }
176 err = BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data)
177 if err != nil {
178 goto LayoutErrDeal
179 }
180 }
181 }
182 }
144 Trace("template Execute err:", err) 183 Trace("template Execute err:", err)
145 } 184 }
146 icontent, _ := ioutil.ReadAll(ibytes) 185 icontent, _ := ioutil.ReadAll(ibytes)
...@@ -161,6 +200,24 @@ func (c *Controller) RenderBytes() ([]byte, error) { ...@@ -161,6 +200,24 @@ func (c *Controller) RenderBytes() ([]byte, error) {
161 } 200 }
162 err := BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data) 201 err := BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data)
163 if err != nil { 202 if err != nil {
203 ErrDeal:
204 if terr, ok := err.(*template.Error); ok {
205 if terr.ErrorCode == template.ErrNoSuchTemplate {
206 reg := regexp.MustCompile("\"(.+)\"")
207 a := reg.FindStringSubmatch(terr.Description)
208 if len(a) > 1 {
209 missfile := path.Join(ViewsPath, subdir, a[1])
210 AllTemplateFiles.files[subdir] = append(AllTemplateFiles.files[subdir], missfile)
211 for k, v := range AllTemplateFiles.files {
212 BeeTemplates[k] = template.Must(template.New("beegoTemplate"+k).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap).ParseFiles(v...))
213 }
214 err = BeeTemplates[subdir].ExecuteTemplate(ibytes, file, c.Data)
215 if err != nil {
216 goto ErrDeal
217 }
218 }
219 }
220 }
164 Trace("template Execute err:", err) 221 Trace("template Execute err:", err)
165 } 222 }
166 icontent, _ := ioutil.ReadAll(ibytes) 223 icontent, _ := ioutil.ReadAll(ibytes)
......
...@@ -13,9 +13,10 @@ import ( ...@@ -13,9 +13,10 @@ import (
13 ) 13 )
14 14
15 var ( 15 var (
16 beegoTplFuncMap template.FuncMap 16 beegoTplFuncMap template.FuncMap
17 BeeTemplates map[string]*template.Template 17 BeeTemplates map[string]*template.Template
18 BeeTemplateExt []string 18 BeeTemplateExt []string
19 AllTemplateFiles *templatefile
19 ) 20 )
20 21
21 func init() { 22 func init() {
...@@ -100,18 +101,18 @@ func BuildTemplate(dir string) error { ...@@ -100,18 +101,18 @@ func BuildTemplate(dir string) error {
100 return errors.New("dir open err") 101 return errors.New("dir open err")
101 } 102 }
102 } 103 }
103 self := templatefile{ 104 AllTemplateFiles = &templatefile{
104 root: dir, 105 root: dir,
105 files: make(map[string][]string), 106 files: make(map[string][]string),
106 } 107 }
107 err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { 108 err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
108 return self.visit(path, f, err) 109 return AllTemplateFiles.visit(path, f, err)
109 }) 110 })
110 if err != nil { 111 if err != nil {
111 fmt.Printf("filepath.Walk() returned %v\n", err) 112 fmt.Printf("filepath.Walk() returned %v\n", err)
112 return err 113 return err
113 } 114 }
114 for k, v := range self.files { 115 for k, v := range AllTemplateFiles.files {
115 BeeTemplates[k] = template.Must(template.New("beegoTemplate"+k).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap).ParseFiles(v...)) 116 BeeTemplates[k] = template.Must(template.New("beegoTemplate"+k).Delims(TemplateLeft, TemplateRight).Funcs(beegoTplFuncMap).ParseFiles(v...))
116 } 117 }
117 return nil 118 return nil
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!