diff --git a/config/setup/templates.go b/config/setup/templates.go index 51d78d5c..f8d7e98b 100644 --- a/config/setup/templates.go +++ b/config/setup/templates.go @@ -32,18 +32,48 @@ func templatesParse(c *Controller) ([]templates.Rule, error) { for c.Next() { var rule templates.Rule - if c.NextArg() { + rule.Path = defaultTemplatePath + rule.Extensions = defaultTemplateExtensions + + args := c.RemainingArgs() + + switch len(args) { + case 0: + // Optional block + for c.NextBlock() { + switch c.Val() { + case "path": + args := c.RemainingArgs() + if len(args) != 1 { + return nil, c.ArgErr() + } + rule.Path = args[0] + + case "ext": + args := c.RemainingArgs() + if len(args) == 0 { + return nil, c.ArgErr() + } + rule.Extensions = args + + case "between": + args := c.RemainingArgs() + if len(args) != 2 { + return nil, c.ArgErr() + } + rule.Delims[0] = args[0] + rule.Delims[1] = args[1] + } + } + default: // First argument would be the path - rule.Path = c.Val() + rule.Path = args[0] // Any remaining arguments are extensions - rule.Extensions = c.RemainingArgs() + rule.Extensions = args[1:] if len(rule.Extensions) == 0 { rule.Extensions = defaultTemplateExtensions } - } else { - rule.Path = defaultTemplatePath - rule.Extensions = defaultTemplateExtensions } for _, ext := range rule.Extensions { @@ -52,7 +82,6 @@ func templatesParse(c *Controller) ([]templates.Rule, error) { rules = append(rules, rule) } - return rules, nil } diff --git a/config/setup/templates_test.go b/config/setup/templates_test.go index e97ab379..b1cfb29c 100644 --- a/config/setup/templates_test.go +++ b/config/setup/templates_test.go @@ -2,8 +2,9 @@ package setup import ( "fmt" - "github.com/mholt/caddy/middleware/templates" "testing" + + "github.com/mholt/caddy/middleware/templates" ) func TestTemplates(t *testing.T) { @@ -40,7 +41,11 @@ func TestTemplates(t *testing.T) { if fmt.Sprint(myHandler.Rules[0].IndexFiles) != fmt.Sprint(indexFiles) { t.Errorf("Expected %v to be the Default Index files", indexFiles) } + if myHandler.Rules[0].Delims != [2]string{} { + t.Errorf("Expected %v to be the Default Delims", [2]string{}) + } } + func TestTemplatesParse(t *testing.T) { tests := []struct { inputTemplateConfig string @@ -50,19 +55,32 @@ func TestTemplatesParse(t *testing.T) { {`templates /api1`, false, []templates.Rule{{ Path: "/api1", Extensions: defaultTemplateExtensions, + Delims: [2]string{}, }}}, {`templates /api2 .txt .htm`, false, []templates.Rule{{ Path: "/api2", Extensions: []string{".txt", ".htm"}, + Delims: [2]string{}, }}}, - {`templates /api3 .htm .html + {`templates /api3 .htm .html templates /api4 .txt .tpl `, false, []templates.Rule{{ Path: "/api3", Extensions: []string{".htm", ".html"}, + Delims: [2]string{}, }, { Path: "/api4", Extensions: []string{".txt", ".tpl"}, + Delims: [2]string{}, + }}}, + {`templates { + path /api5 + ext .html + between {% %} + }`, false, []templates.Rule{{ + Path: "/api5", + Extensions: []string{".html"}, + Delims: [2]string{"{%", "%}"}, }}}, } for i, test := range tests { diff --git a/middleware/templates/templates.go b/middleware/templates/templates.go index 76447479..bc48ac45 100644 --- a/middleware/templates/templates.go +++ b/middleware/templates/templates.go @@ -33,9 +33,18 @@ func (t Templates) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error // Create execution context ctx := middleware.Context{Root: t.FileSys, Req: r, URL: r.URL} + // New template + templateName := filepath.Base(fpath) + tpl := template.New(templateName) + + // Set delims + if rule.Delims != [2]string{} { + tpl.Delims(rule.Delims[0], rule.Delims[1]) + } + // Build the template templatePath := filepath.Join(t.Root, fpath) - tpl, err := template.ParseFiles(templatePath) + tpl, err := tpl.ParseFiles(templatePath) if err != nil { if os.IsNotExist(err) { return http.StatusNotFound, nil @@ -82,4 +91,5 @@ type Rule struct { Path string Extensions []string IndexFiles []string + Delims [2]string } diff --git a/middleware/templates/templates_test.go b/middleware/templates/templates_test.go index 3ee6072c..c5a5d24a 100644 --- a/middleware/templates/templates_test.go +++ b/middleware/templates/templates_test.go @@ -23,6 +23,7 @@ func Test(t *testing.T) { Extensions: []string{".html", ".htm"}, IndexFiles: []string{"index.html", "index.htm"}, Path: "/images", + Delims: [2]string{"{%", "%}"}, }, }, Root: "./testdata", @@ -94,6 +95,30 @@ func Test(t *testing.T) { t.Fatalf("Test: the expected body %v is different from the response one: %v", expectedBody, respBody) } + /* + * Test tmpl on /images/img2.htm + */ + req, err = http.NewRequest("GET", "/images/img2.htm", nil) + if err != nil { + t.Fatalf("Could not create HTTP request: %v", err) + } + + rec = httptest.NewRecorder() + + tmpl.ServeHTTP(rec, req) + + if rec.Code != http.StatusOK { + t.Fatalf("Test: Wrong response code: %d, should be %d", rec.Code, http.StatusOK) + } + + respBody = rec.Body.String() + expectedBody = `img{{.Include "header.html"}} +` + + if respBody != expectedBody { + t.Fatalf("Test: the expected body %v is different from the response one: %v", expectedBody, respBody) + } + /* * Test tmplroot on /root.html */ diff --git a/middleware/templates/testdata/images/img.htm b/middleware/templates/testdata/images/img.htm index 865a7380..c9060204 100644 --- a/middleware/templates/testdata/images/img.htm +++ b/middleware/templates/testdata/images/img.htm @@ -1 +1 @@ -img{{.Include "header.html"}} +img{%.Include "header.html"%} diff --git a/middleware/templates/testdata/images/img2.htm b/middleware/templates/testdata/images/img2.htm new file mode 100644 index 00000000..865a7380 --- /dev/null +++ b/middleware/templates/testdata/images/img2.htm @@ -0,0 +1 @@ +img{{.Include "header.html"}}