diff --git a/config/setup/templates.go b/config/setup/templates.go index 51d78d5ce..f8d7e98bd 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/middleware/templates/templates.go b/middleware/templates/templates.go index 76447479d..bc48ac45d 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 3ee6072ce..c5a5d24a8 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 = `