Add the {{slug}} template helper

pull/6/head
Mickaël Menu 4 years ago
parent 76ac1d1bb1
commit 6dfa9b6949
No known key found for this signature in database
GPG Key ID: 53D73664CD359895

@ -1 +1 @@
Salut, <{{name}}>!
Salut, {{name}}!

@ -2,13 +2,22 @@ package handlebars
import (
"html"
"io/ioutil"
"log"
"os"
"path/filepath"
"github.com/aymerick/raymond"
"github.com/mickael-menu/zk/adapter/handlebars/helpers"
"github.com/mickael-menu/zk/util/errors"
)
func Init() {
// FIXME Pass the logger as dependency
logger := log.New(os.Stderr, "zk: warning: ", 0)
// FIXME Support custom languages from the config
helpers.RegisterSlug(logger, "en")
}
// HandlebarsRenderer holds parsed handlebars template and renders them.
type HandlebarsRenderer struct {
templates map[string]*raymond.Template
@ -23,11 +32,11 @@ func NewRenderer() *HandlebarsRenderer {
// Render renders a handlebars string template with the given context.
func (hr *HandlebarsRenderer) Render(template string, context interface{}) (string, error) {
template = html.EscapeString(template)
res, err := raymond.Render(template, context)
if err != nil {
return "", errors.Wrap(err, "render template failed")
}
return html.UnescapeString(res), nil
}
@ -65,11 +74,7 @@ func (hr *HandlebarsRenderer) loadFileTemplate(path string) (*raymond.Template,
}
// Load new template.
bytes, err := ioutil.ReadFile(path)
if err != nil {
return nil, wrap(err)
}
templ, err = raymond.Parse(html.EscapeString(string(bytes)))
templ, err = raymond.ParseFile(path)
if err != nil {
return nil, wrap(err)
}

@ -7,6 +7,10 @@ import (
"github.com/mickael-menu/zk/util/fixtures"
)
func init() {
Init()
}
func TestRenderString(t *testing.T) {
sut := NewRenderer()
res, err := sut.Render("Goodbye, {{name}}", map[string]string{"name": "Ed"})
@ -31,11 +35,22 @@ func TestUnknownVariable(t *testing.T) {
func TestDoesntEscapeHTML(t *testing.T) {
sut := NewRenderer()
res, err := sut.Render("Salut, <{{name}}>!", map[string]string{"name": "l'ami"})
res, err := sut.Render("Salut, {{name}}!", map[string]string{"name": "l'ami"})
assert.Nil(t, err)
assert.Equal(t, res, "Salut, <l'ami>!")
assert.Equal(t, res, "Salut, l'ami!")
res, err = sut.RenderFile(fixtures.Path("unescape.txt"), map[string]string{"name": "l'ami"})
assert.Nil(t, err)
assert.Equal(t, res, "Salut, <l'ami>!\n")
assert.Equal(t, res, "Salut, l'ami!\n")
}
func TestSlug(t *testing.T) {
sut := NewRenderer()
res, err := sut.Render("{{#slug}}This will be slugified!{{/slug}}", nil)
assert.Nil(t, err)
assert.Equal(t, res, "this-will-be-slugified")
res, err = sut.Render(`{{slug "This will be slugified!"}}`, nil)
assert.Nil(t, err)
assert.Equal(t, res, "this-will-be-slugified")
}

@ -0,0 +1,22 @@
package helpers
import (
"github.com/aymerick/raymond"
"github.com/gosimple/slug"
"github.com/mickael-menu/zk/util"
)
// FIXME Support custom languages with slug.MakeLang()
func RegisterSlug(logger util.Logger, lang string) {
raymond.RegisterHelper("slug", func(opt interface{}) string {
switch arg := opt.(type) {
case *raymond.Options:
return slug.MakeLang(arg.Fn(), lang)
case string:
return slug.MakeLang(arg, lang)
default:
logger.Printf("the {{slug}} template helper is expecting a string as argument, received: %v", opt)
return ""
}
})
}

@ -6,6 +6,7 @@ require (
github.com/alecthomas/kong v0.2.12
github.com/aymerick/raymond v2.0.2+incompatible
github.com/google/go-cmp v0.3.1
github.com/gosimple/slug v1.9.0
github.com/hashicorp/hcl/v2 v2.8.1
gopkg.in/yaml.v2 v2.4.0 // indirect
)

@ -16,6 +16,8 @@ github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3a
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs=
github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg=
github.com/hashicorp/hcl/v2 v2.8.1 h1:FJ60CIYaMyJOKzPndhMyjiz353Fd+2jr6PodF5Xzb08=
github.com/hashicorp/hcl/v2 v2.8.1/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
@ -31,6 +33,8 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ=
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=

@ -0,0 +1,8 @@
package util
// Logger can be used to report logging messages.
// The native log.Logger type implements this interface.
type Logger interface {
Printf(format string, v ...interface{})
Println(v ...interface{})
}
Loading…
Cancel
Save