Skip to content

Commit 920e13d

Browse files
committed
added templating structure
1 parent 4e6970f commit 920e13d

File tree

1 file changed

+224
-0
lines changed

1 file changed

+224
-0
lines changed

templates.go

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
package web
2+
3+
import (
4+
"errors"
5+
"html/template"
6+
"log"
7+
"net/http"
8+
"os"
9+
)
10+
11+
var (
12+
tmpl *Template
13+
)
14+
15+
type Template struct {
16+
Layout string
17+
Template string
18+
Bag map[string]interface{}
19+
Writer http.ResponseWriter
20+
FuncMap template.FuncMap
21+
HtmlTemplate *template.Template
22+
}
23+
24+
/* Templating |-- Using html/template library built into golang http://golang.org/pkg/html/template/ --|
25+
------------------------------ */
26+
27+
func CreateTemplate(w http.ResponseWriter) (templ *Template, err error) {
28+
if w == nil {
29+
log.Printf("Template Error: %v", err.Error())
30+
return
31+
}
32+
templ = &Template{
33+
Writer: w,
34+
Bag: make(map[string]interface{}),
35+
FuncMap: template.FuncMap{},
36+
}
37+
38+
return
39+
}
40+
41+
func (t Template) SinglePage(file_path string) (err error) {
42+
43+
dir, err := os.Getwd()
44+
if err != nil {
45+
return
46+
}
47+
48+
if t.Bag == nil {
49+
t.Bag = make(map[string]interface{})
50+
}
51+
if len(file_path) != 0 {
52+
t.Template = dir + "/" + file_path
53+
}
54+
55+
tmpl, err := template.ParseFiles(t.Template)
56+
if err != nil {
57+
return err
58+
}
59+
tmpl.Funcs(t.FuncMap)
60+
err = tmpl.Execute(t.Writer, t.Bag)
61+
if err != nil {
62+
log.Println(err)
63+
}
64+
65+
return
66+
}
67+
68+
func (t Template) DisplayTemplate() (err error) {
69+
70+
dir, err := os.Getwd()
71+
if err != nil {
72+
return
73+
}
74+
75+
if t.Layout == "" {
76+
t.Layout = "layout.html"
77+
}
78+
// ensure proper pathing for layout layout files
79+
t.Layout = dir + "/" + t.Layout
80+
t.Template = dir + "/" + t.Template
81+
82+
if t.Bag == nil {
83+
t.Bag = make(map[string]interface{})
84+
}
85+
86+
templ, err := template.ParseFiles(t.Layout, t.Template)
87+
if err != nil {
88+
return err
89+
}
90+
templ.Funcs(t.FuncMap)
91+
92+
err = templ.Execute(t.Writer, t.Bag)
93+
if err != nil {
94+
log.Println(err)
95+
}
96+
97+
return
98+
}
99+
100+
func (t Template) DisplayMultiple(templates []string) (err error) {
101+
102+
dir, err := os.Getwd()
103+
if err != nil {
104+
return
105+
}
106+
107+
if t.Layout == "" {
108+
t.Layout = "layout.html"
109+
}
110+
// ensure proper pathing for layout layout files
111+
t.Layout = t.Layout
112+
113+
templ, err := template.ParseFiles(dir + "/" + t.Layout)
114+
if err != nil {
115+
return err
116+
}
117+
templ.Funcs(t.FuncMap)
118+
for _, filename := range templates {
119+
_, err = templ.ParseFiles(dir + "/" + filename)
120+
}
121+
122+
err = templ.Execute(t.Writer, t.Bag)
123+
if err != nil {
124+
log.Println(err)
125+
}
126+
127+
return
128+
}
129+
130+
func SetTemplate(t *Template) {
131+
tmpl = t
132+
}
133+
134+
func (t *Template) ParseFile(file string, override bool) error {
135+
dir := ""
136+
var err error
137+
if !override {
138+
dir, err = os.Getwd()
139+
if err != nil {
140+
return err
141+
}
142+
}
143+
var tmpl *template.Template
144+
if t.HtmlTemplate == nil {
145+
146+
tmpl, err = template.New(file).Funcs(t.FuncMap).ParseFiles(dir + "/" + file)
147+
if err != nil {
148+
return err
149+
}
150+
tmpl.Funcs(t.FuncMap)
151+
} else {
152+
// Make sure the FuncMap is added to the template before parsing the new file
153+
t.HtmlTemplate.Funcs(t.FuncMap)
154+
tmpl, err = t.HtmlTemplate.ParseFiles(dir + "/" + file)
155+
if err != nil {
156+
return err
157+
}
158+
}
159+
t.HtmlTemplate = tmpl
160+
161+
if err != nil {
162+
log.Println(err)
163+
}
164+
165+
return err
166+
}
167+
168+
func (t Template) Display(w http.ResponseWriter) error {
169+
170+
t.Writer = w
171+
if t.HtmlTemplate == nil {
172+
if t.Template == "" {
173+
return errors.New("No template files defined")
174+
}
175+
176+
dir, err := os.Getwd()
177+
if err != nil {
178+
return err
179+
}
180+
181+
tmpl, err := template.ParseFiles(dir + "/" + t.Template)
182+
183+
if err != nil {
184+
log.Println(err)
185+
return err
186+
}
187+
tmpl.Funcs(t.FuncMap)
188+
189+
t.HtmlTemplate = tmpl
190+
return nil
191+
}
192+
193+
err := tmpl.HtmlTemplate.Execute(t.Writer, t.Bag)
194+
if err != nil {
195+
log.Println(err)
196+
}
197+
198+
return err
199+
}
200+
201+
func GetTemplate() (*Template, error) {
202+
if tmpl != nil {
203+
return tmpl, nil
204+
}
205+
err := errors.New("No template defined")
206+
if err != nil {
207+
log.Println(err)
208+
}
209+
210+
return nil, err
211+
}
212+
213+
func NewTemplate(w http.ResponseWriter) *Template {
214+
215+
tmpl, err := GetTemplate()
216+
if err != nil {
217+
tmpl, err = CreateTemplate(w)
218+
if err != nil {
219+
http.Error(w, err.Error(), http.StatusInternalServerError)
220+
return tmpl
221+
}
222+
}
223+
return tmpl
224+
}

0 commit comments

Comments
 (0)